Eu tenho uma pergunta semelhante a isso , mas não exatamente a mesma.
Gostaria que o usuário do meu aplicativo o instalasse com as dependências necessárias para a maneira como ele gostaria de usá-lo. Portanto, por exemplo, se eles quiserem persistir no MongoDB, apenas as bibliotecas relacionadas ao Mongo serão instaladas, mas se quiserem persistir no Redis, somente as bibliotecas relacionadas ao Redis serão instaladas. Não quero fazê-los baixar e instalar bibliotecas que não usarão.
Eu sei que posso fazer isso para fins de desenvolvimento devDependencies
, mas isso vai além disso. Como diz a resposta na pergunta acima, isso está mais estreitamente relacionado aos perfis de Python setuptools
extras_require
e Clojure leiningen
. Algo assim em NPM? Eu realmente sinto que devDependencies
deveria ser um dev
perfil de uma maneira mais versátil de especificar dependências.
fonte
MyPackage-Core
MyPackage-Db-Mongo
MyPackage-Db-Redis
etc ... da maneira como as pessoas fazem módulos bower, destinados a estender angularjs .package.json
foi resolvida em outros gerenciadores de pacotes.Respostas:
O módulo de co-dependência pode ser o que você está procurando ou qualquer coisa que faça algo semelhante a:
package.json
que não são instaladas automaticamente pornpm install
, digamosoptionalPeerDependencies
require
função de estilo personalizado que sabeoptionalPeerDependencies
e faz a coisa certa, incluindo lançar / aviso quando nada é encontrado que atenda a uma classe necessária de módulos (por exemploredis
, nemmongo
, nemmysql
, nem , etc. estão instalados).Uma variação seria se a funcionalidade principal do módulo funcionasse sem dependências opcionais (por exemplo, padrão de plug-in), sem erro / aviso quando nada for encontrado que atenda a uma dependência de pares.
Outra variação é fazer a lista acima enquanto considera as dependências de produção versus desenvolvimento, isto é, um análogo para
dependencies
edevDependencies
.Talvez combinado com uma demanda sob demanda, de modo que módulos opcionais sejam necessários preguiçosamente, por exemplo:
fonte
codependency
módulo fornece no caso em que o módulo evapora do NPM e porque os links sem trechos são de má forma SO.Se você quiser dependências opcionais simples, como plug-ins, por exemplo, se você instalar o foo, será executado colorido, mas se não estiver instalado, você não terá nenhum problema e o verá em cinza, então poderá usar o Dependecies opcional no package.json :
E no código:
Extraído da documentação package.json .
fonte
O que faço é configurar um script de instalação no meu package.json, por dentro
scripts
, assim:Ele será executado logo após o término
npm install
. Eu o uso principalmente para gerar automaticamente um.env
arquivo com padrões.O
my-install.js
script pode executar comandos diferentes, criar arquivos, solicitar a entrada do usuário, para que você possa dizer "Deseja Redis ou Mongo?":Esta é uma resposta muito rápida, consulte a linha de leitura para ler a entrada do usuário corretamente e o processo filho para executar comandos e processar a saída, etc.
Observe também que o script de instalação pode ser o que você desejar (python, bash, etc)
fonte
npm install
novamente dentro de um script de instalação também pode disparar um comportamento não intencional. Eu não recomendo esta solução.O npm realmente não foi projetado para isso, pois uma das partes mais difíceis do gerenciamento de dependências é garantir construções rápidas e reproduzíveis, fáceis e relativamente à prova de falhas. Mas acredito que há um caso de uso, e certamente havia para mim. Então, escrevi um pacote para fazer exatamente o que você está pedindo.
Meu pacote é
install-subset
e pode ser instalado globalmente comnpm install -g install-subset
https://www.npmjs.com/package/install-subset
Primeiro, você cria listas de permissões e listas negras para subconjuntos de instalação nomeados em seu package.json assim:
Em seguida, chame-o com, por exemplo,
install-subset test
Isso reescreverá temporariamente o seu package.json para não instalar esses pacotes na lista negra e depois restaurá-lo, o que, dependendo dos pacotes, pode economizar muito tempo e largura de banda.
Também funciona com fios, é de código aberto e problemas / PRs são bem-vindos.
Em muitos casos, eu uso isso em nosso servidor ci para diminuir o tempo de compilação e, em nosso projeto mais recente do React Native, nossa instalação típica de desenvolvedor novo passou de 72 segundos para cerca de 20 segundos.
fonte