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?

kamyl
fonte
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.

wookieb
fonte
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

Valentin
fonte
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.

Carsten Führmann
fonte