Qual é a maneira mais correta de instalar npm packages
em subpastas aninhadas?
my-app
/my-sub-module
package.json
package.json
Qual é a melhor maneira de fazer packages
com que /my-sub-module
seja instalado automaticamente ao ser npm install
executado my-app
?
Respostas:
Se você deseja executar um único comando para instalar pacotes npm em subpastas aninhadas, você pode executar um script via
npm
e principalpackage.json
em seu diretório raiz. O script visitará cada subdiretório e será executadonpm install
.Abaixo está um
.js
script que alcançará o resultado desejado:Observe que este é um exemplo tirado de um artigo do StrongLoop que aborda especificamente uma estrutura de
node.js
projeto modular (incluindo componentes epackage.json
arquivos aninhados ).Conforme sugerido, você também pode conseguir o mesmo com um script bash.
EDIT: Fez o código funcionar no Windows
fonte
Eu prefiro usar pós-instalação, se você souber os nomes do subdiretório aninhado. Em
package.json
:fonte
"postinstall": "cd nested_dir2 && npm install"
para cada pasta?De acordo com a resposta de @ Scott, o script install | postinstall é a maneira mais simples, desde que os nomes dos subdiretórios sejam conhecidos. É assim que eu o executo para vários sub dirs. Por exemplo, fingir que temos
api/
,web/
eshared/
subprojetos em uma raiz monorepo:fonte
( )
para criar subshells e evitarcd api && npm install && cd ..
.npm install
no nível superior:"(cd was unexpected at this time."
Minha solução é muito semelhante. Pure Node.js
O script a seguir examina todas as subpastas (recursivamente), desde que existam
package.json
e sejam executadasnpm install
em cada uma delas. Pode-se adicionar exceções a ele: pastas permitidas não tendopackage.json
. No exemplo abaixo, uma dessas pastas é "pacotes". Pode-se executá-lo como um script de "pré-instalação".fonte
Apenas para referência, caso as pessoas se deparem com esta pergunta. Agora você pode:
npm install --save path/to/my/subfolder
fonte
mkdir -p a/b ; cd a ; npm init ; cd b ; npm init ; npm install --save through2 ;
Agora espere ... você acabou de instalar manualmente as dependências em "b", não é isso que acontece quando você clona um novo projeto.rm -rf node_modules ; cd .. ; npm install --save ./b
. Agora liste node_modules e, em seguida, liste b.Caso de uso 1 : se você quiser executar comandos npm de dentro de cada subdiretório (onde cada package.json está), você precisará usar
postinstall
.Como costumo usar de
npm-run-all
qualquer maneira, eu o uso para mantê-lo bonito e curto (a parte na pós-instalação):Isso tem a vantagem de poder instalar tudo de uma vez ou individualmente. Se você não precisa disso ou não quer
npm-run-all
como uma dependência, verifique a resposta do demisx (usando subshells no postinstall).Caso de uso 2 : se você for executar todos os comandos npm do diretório raiz (e, por exemplo, não usar scripts npm em subdiretórios), poderá simplesmente instalar cada subdiretório como faria com qualquer dependência:
No último caso, não se surpreenda se não encontrar nenhum arquivo
node_modules
oupackage-lock.json
nos subdiretórios - todos os pacotes serão instalados na raiznode_modules
, por isso você não será capaz de executar seus comandos npm (que requerem dependências) de qualquer um de seus subdiretórios.Se você não tiver certeza, use o caso 1 sempre funciona.
fonte
run-p
não é necessário, mas é mais detalhado"postinstall": "npm run install:a && npm run install:b"
&&
semrun-p
. Mas, como você disse, isso é menos legível. Outra desvantagem (que o run-p resolve porque as instalações são executadas em paralelo) é que, se um falhar, nenhum outro script será afetadoAdicionando suporte do Windows à resposta do snozza , bem como pular a
node_modules
pasta, se houver.fonte
Inspirado pelos scripts fornecidos aqui, construí um exemplo configurável que:
yarn
ounpm
yarn
mas um diretório tiver apenas um,package-lock.json
ele será usadonpm
para esse diretório (o padrão é verdadeiro).cp.spawn
yarn workspaces
(configurável)E com ele sendo usado:
fonte
Se você tiver um
find
utilitário no sistema, poderá tentar executar o seguinte comando no diretório raiz do aplicativo:find . ! -path "*/node_modules/*" -name "package.json" -execdir npm install \;
Basicamente, encontre todos os
package.json
arquivos e executenpm install
naquele diretório, pulando todos osnode_modules
diretórios.fonte
find . ! -path "*/node_modules/*" ! -path "*/additional_path/*" -name "package.json" -execdir npm install \;