Quelle est la manière la plus correcte d'installer npm packages
dans des sous-dossiers imbriqués?
my-app
/my-sub-module
package.json
package.json
Quelle est la meilleure façon d'avoir packages
à /my-sub-module
installer automatiquement de npm install
fonctionner en my-app
?
Réponses:
Si vous souhaitez exécuter une seule commande pour installer les packages npm dans des sous-dossiers imbriqués, vous pouvez exécuter un script via
npm
et mainpackage.json
dans votre répertoire racine. Le script visitera chaque sous-répertoire et s'exécuteranpm install
.Vous trouverez ci-dessous un
.js
script qui atteindra le résultat souhaité:Notez qu'il s'agit d'un exemple tiré d'un article StrongLoop qui traite spécifiquement d'une
node.js
structure de projet modulaire (y compris les composants etpackage.json
fichiers imbriqués ).Comme suggéré, vous pouvez également réaliser la même chose avec un script bash.
EDIT: fait fonctionner le code sous Windows
la source
Je préfère utiliser la post-installation, si vous connaissez les noms du sous-répertoire imbriqué. Dans
package.json
:la source
"postinstall": "cd nested_dir2 && npm install"
pour chaque dossier?Selon la réponse de @ Scott, le script install | postinstall est le moyen le plus simple tant que les noms de sous-répertoires sont connus. C'est ainsi que je l'exécute pour plusieurs sous-répertoires. Par exemple, prétendez que nous avons
api/
,web/
etshared/
sous-projets dans une racine monorepo:la source
( )
pour créer des sous-shell et évitercd api && npm install && cd ..
.npm install
"(cd was unexpected at this time."
Ma solution est très similaire. Pure Node.js
Le script suivant examine tous les sous-dossiers (de manière récursive) tant qu'ils ont
package.json
et s'exécutenpm install
dans chacun d'eux. On peut y ajouter des exceptions: les dossiers autorisés ne l'ont paspackage.json
. Dans l'exemple ci-dessous, l'un de ces dossiers est "packages". On peut l'exécuter en tant que script de "pré-installation".la source
Juste pour référence au cas où les gens rencontreraient cette question. Tu peux maintenant:
npm install --save path/to/my/subfolder
la source
mkdir -p a/b ; cd a ; npm init ; cd b ; npm init ; npm install --save through2 ;
Maintenant, attendez ... vous venez d' installer manuellement les dépendances dans "b", ce n'est pas ce qui se passe lorsque vous clonez un nouveau projet.rm -rf node_modules ; cd .. ; npm install --save ./b
. Maintenant listez node_modules, puis listez b.Cas d'utilisation 1 : si vous voulez pouvoir exécuter des commandes npm à partir de chaque sous-répertoire (où se trouve chaque package.json), vous devrez utiliser
postinstall
.Comme je l'utilise souvent de
npm-run-all
toute façon, je l'utilise pour le garder court et court (la partie de la post-installation):Cela a l'avantage supplémentaire que je peux installer en une seule fois ou individuellement. Si tu n'en as pas besoin ou que tu ne veux pas
npm-run-all
tant que dépendance, consultez la réponse de demisx (en utilisant des sous-shell dans la post-installation).Cas d'utilisation 2 : Si vous exécutez toutes les commandes npm à partir du répertoire racine (et, par exemple, n'utilisez pas de scripts npm dans les sous-répertoires), vous pouvez simplement installer chaque sous-répertoire comme vous le feriez pour n'importe quelle dépendance:
Dans ce dernier cas, ne soyez pas surpris que vous ne trouviez aucun fichier
node_modules
oupackage-lock.json
dans les sous-répertoires - tous les packages seront installés à la racinenode_modules
, c'est pourquoi vous ne pourrez pas exécuter vos commandes npm (que nécessitent des dépendances) de l'un de vos sous-répertoires.Si vous n'êtes pas sûr, le cas d'utilisation 1 fonctionne toujours.
la source
run-p
n'est pas nécessaire, mais c'est alors plus verbeux"postinstall": "npm run install:a && npm run install:b"
&&
sansrun-p
. Mais comme vous le dites, c'est moins lisible. Un autre inconvénient (que run-p résout car les installations s'exécutent en parallèle) est que si l'un échoue, aucun autre script n'est affectéAjout de la prise en charge de Windows à la réponse de snozza , ainsi que saut de
node_modules
dossier le cas échéant.la source
Inspiré par les scripts fournis ici, j'ai construit un exemple configurable qui:
yarn
ounpm
yarn
mais qu'un répertoire n'en a qu'un,package-lock.json
il utiliseranpm
pour ce répertoire (la valeur par défaut est true).cp.spawn
yarn workspaces
(configurable)Et avec son utilisation:
la source
Si vous avez un
find
utilitaire sur votre système, vous pouvez essayer d'exécuter la commande suivante dans le répertoire racine de votre application:find . ! -path "*/node_modules/*" -name "package.json" -execdir npm install \;
En gros, recherchez tous les
package.json
fichiers et exécutez-lesnpm install
dans ce répertoire, en ignorant tous lesnode_modules
répertoires.la source
find . ! -path "*/node_modules/*" ! -path "*/additional_path/*" -name "package.json" -execdir npm install \;