¿Cuál es la forma más correcta de instalar npm packages
en subcarpetas anidadas?
my-app
/my-sub-module
package.json
package.json
¿Cuál es la mejor manera de tener packages
en /my-sub-module
instalarse automáticamente cuando npm install
se ejecute en my-app
?
Respuestas:
Si desea ejecutar un solo comando para instalar paquetes npm en subcarpetas anidadas, puede ejecutar un script a través de
npm
y mainpackage.json
en su directorio raíz. El script visitará todos los subdirectorios y se ejecutaránpm install
.A continuación se muestra un
.js
script que logrará el resultado deseado:Tenga en cuenta que este es un ejemplo tomado de StrongLoop artículo de que aborda específicamente una estructura de
node.js
proyecto modular (incluidos componentes anidados ypackage.json
archivos ).Como se sugirió, también podría lograr lo mismo con un script bash.
EDITAR: hizo que el código funcionara en Windows
fuente
Prefiero usar post-install, si conoce los nombres del subdirectorio anidado. En
package.json
:fuente
"postinstall": "cd nested_dir2 && npm install"
para cada carpeta?Según la respuesta de @ Scott, el script install | postinstall es la forma más sencilla siempre que se conozcan los nombres de los subdirectorios. Así es como lo ejecuto para múltiples subdirectorios. Por ejemplo, pretender que tenemos
api/
,web/
yshared/
sub-proyectos en una raíz monorepo:fuente
( )
para crear subcapas y evitarcd api && npm install && cd ..
.npm install
"(cd was unexpected at this time."
Mi solución es muy similar. Pure Node.js
La siguiente secuencia de comandos examina todas las subcarpetas (de forma recursiva) siempre que tengan
package.json
y se ejecutenpm install
en cada una de ellas. Se le pueden agregar excepciones: carpetas permitidas no tenerpackage.json
. En el ejemplo siguiente, una de estas carpetas es "paquetes". Se puede ejecutar como un script "preinstalado".fuente
Solo como referencia en caso de que las personas se encuentren con esta pregunta. Tu puedes ahora:
npm install --save path/to/my/subfolder
fuente
mkdir -p a/b ; cd a ; npm init ; cd b ; npm init ; npm install --save through2 ;
Ahora espera ... acabas de instalar manualmente las dependencias en "b", eso no es lo que sucede cuando clonas un proyecto nuevo.rm -rf node_modules ; cd .. ; npm install --save ./b
. Ahora enumere node_modules, luego enumere b.Caso de uso 1 : si desea poder ejecutar comandos npm desde cada subdirectorio (donde se encuentra cada package.json), deberá usar
postinstall
.Como lo uso a menudo de
npm-run-all
todos modos, lo uso para mantenerlo agradable y corto (la parte en el postinstall):Esto tiene el beneficio adicional de que puedo instalarlo todo a la vez o individualmente. Si no necesita esto o no quiere
npm-run-all
como dependencia, consulte la respuesta de demisx (usando subshells en postinstall).Caso de uso 2 : si va a ejecutar todos los comandos npm desde el directorio raíz (y, por ejemplo, no usará scripts npm en subdirectorios), simplemente puede instalar cada subdirectorio como lo haría con cualquier dependencia:
En el último caso, no se sorprenda de no encontrar ningún archivo
node_modules
opackage-lock.json
archivo en los subdirectorios; todos los paquetes se instalarán en la raíznode_modules
, por lo que no podrá ejecutar sus comandos npm (que requieren dependencias) de cualquiera de sus subdirectorios.Si no está seguro, el caso de uso 1 siempre funciona.
fuente
run-p
no es necesario, pero luego es más detallado"postinstall": "npm run install:a && npm run install:b"
&&
sinrun-p
. Pero como dices, eso es menos legible. Otro inconveniente (que run-p resuelve porque las instalaciones se ejecutan en paralelo) es que si uno falla, ningún otro script se ve afectadoAgregar soporte de Windows a la respuesta de snozza , así como omitir la
node_modules
carpeta si está presente.fuente
Inspirado por los scripts proporcionados aquí, construí un ejemplo configurable que:
yarn
onpm
yarn
pero un directorio solo tiene unpackage-lock.json
, se usaránpm
para ese directorio (el valor predeterminado es verdadero).cp.spawn
yarn workspaces
(configurable)Y con su uso:
fuente
Si tiene
find
utilidad en su sistema, puede intentar ejecutar el siguiente comando en el directorio raíz de su aplicación:find . ! -path "*/node_modules/*" -name "package.json" -execdir npm install \;
Básicamente, busque todos los
package.json
archivos y ejecútelosnpm install
en ese directorio, saltándose todos losnode_modules
directorios.fuente
find . ! -path "*/node_modules/*" ! -path "*/additional_path/*" -name "package.json" -execdir npm install \;