Como eu decido se @ types / * entra em `dependencies` ou` devDependencies`?


194

Eu uso o TypeScript 2 no meu projeto. Gostaria de usar alguma biblioteca js, mas também digitações para essa biblioteca. Eu posso instalar tipos com simples npm install @types/some-library. Não tenho certeza se devo --saveou --save-develes. Parece-me que mesmo o readme do DefinitelyTyped GitHub menciona as duas versões, mas nunca as explica. Eu acho que o @types deve estar dentro devDependencies, pois os tipos são necessários para o desenvolvimento e não são usados ​​em tempo de execução, mas eu vi muitas vezes o @types apenas dependencies. Estou confuso.

Como devo decidir se @ types / * entra dependenciesou devDependencies? Na verdade, existem instruções mais ou menos oficiais?


Você está gerando um pacote configurável ou este é um pacote que será usado por outras pessoas? A meu ver, você só precisa fazer a distinção entre dependenciese devDependenciesno último caso.
Valentin

Eu faço algum jogo em js / ts do zero. Eu empacoto tudo com o webpack. Não existe nenhum back-end, mas é possível que eu envolva tudo no Electron para torná-lo independente algum dia. Eu não acho que alguém possa usá-lo como uma dependência em seu próprio aplicativo, mas acho que isso seria possível (pense em minijogos em jogos GTA; e meu jogo é de código aberto). Ainda assim, quero aprender e seguir as melhores práticas e é a principal razão pela qual faço esse jogo. Espero ter esclarecido meu caso de uso bem o suficiente. :)
kamyl 14/09/17

1
Sim, faz sentido, só queria ter certeza de que minha resposta original era relevante para o seu caso de uso. Eu ainda acho que a distinção entre devDependenciese dependenciesé irrelevante quando a construção de um pacote, é algo que create-react-appEnforces bem , mas em última análise, cabe a você escolher
Valentin

Respostas:


132

Digamos que você esteja desenvolvendo um pacote "A" que tenha o pacote @ types / some-module em devDependencies. Por algum motivo, você está exportando o tipo de @ types / some-module

import {SomeType} from 'some-module';
export default class APackageClass {
     constructor(private config: SomeType) {

     }
}

No momento, os consumidores de texto datilografado do pacote "A" não conseguem adivinhar o que é SomeType, pois as devDependencies do pacote "A" NÃO estão instaladas.

Nesse caso específico, você PRECISA colocar @ types / * package com "dependências" regulares. Para outros casos, as "devDependencies" são boas o suficiente.


6
Então você sugere que, se eu usar apenas o tipo na implementação, sua definição de tipo pode ser devDependencies?
Franklin Yu

6
Sim @FranklinYu. Assim que o tipo aparecer no arquivo de declaração, você precisará colocá-lo dependencies. Caso contrário, tudo devDependenciesbem
wookieb 26/01

1
Mas um pacote funciona para TS e JS. Os desenvolvedores de JS não precisam desses tipos para compilar seu código. Adicionar a definição de tipo dependenciesfará com que a árvore de dependência fique inchada.
Tyler Long

1
@TylerLong Correct. Não é perfeito, mas isso é realidade. Opcionalmente, você também pode usar "optionalDependencies", mas acredito que em grande escala pode ser muito irritante.
wookieb

55

Se você está apenas gerando um pacote, pode não haver necessidade de fazer a distinção entre dependenciese devDependencies. Esse recurso npmgeralmente é útil ao publicar um pacote que pode ser usado por outras pessoas e você não deseja enviá-las por spam com dependências redundantes.

Pode haver outros casos de uso em que a dependência de divisão pode ser útil, mas, a menos que você tenha uma necessidade expressa disso, meu conselho é escolher apenas uma e colocar tudo lá. Não é difícil separá-los posteriormente, se necessário.

Um exemplo bem conhecido dessa prática IRL é create-react-app, por padrão, o clichê não ejetado que ele cria coloca tudo dependencies, consulte esta discussão e esta resposta


7
Se você não está publicando o pacote, isso está correto, mas se estiver, não tem nada a ver com desenvolvimento versus tempo de execução e tudo o que é necessário para construir este pacote versus o necessário para usar este pacote .
Yogu

1
@Yogu É por isso que fiz a distinção em primeiro lugar então sim, eu concordo completamente com você
Valentin

12
Não concordo com este conselho. devDependenciesnão são instalados quando você faz npm install --production(ou npm ci --production) e, portanto, não estão disponíveis ao executar o código de produção. Essa é uma diferença muito significativa para um serviço, não apenas para uma biblioteca.
23919 Brad Brad Wilson

2
@BradWilson Você tem razão, existem muitos fluxos de trabalho npm sob o sol, se o seu caso de uso exigir que você faça a distinção, faça-o de qualquer maneira. Sinta-se à vontade para fornecer sua própria resposta a esse dilema.
Valentin

Atualizei minha resposta para mencionar a existência de outros casos de uso em que a distinção pode ser significativa e deu exemplos do mundo real. Obrigado pelo feedback!
Valentin

15

No caso específico de implantar um aplicativo Node.js. na produção, é necessário instalar apenas as dependências necessárias para executar o aplicativo.

npm install --production ou

npm ci --production ou

yarn --production

Nesse caso, os tipos devem estar no devDependencies, para impedir que inchem a instalação.

Observação: sei que isso foi mencionado em um comentário de Brad Wilson para outra resposta. Este ponto parece digno de ser uma resposta, no entanto.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.