Каков наиболее правильный способ установки npm packages
во вложенные подпапки?
my-app
/my-sub-module
package.json
package.json
Что такое лучший способ быть packages
в /my-sub-module
устанавливается автоматически при npm install
запуске в my-app
?
Ответы:
Если вы хотите запустить одну команду для установки пакетов npm во вложенных подпапках, вы можете запустить сценарий через
npm
и mainpackage.json
в корневом каталоге. Скрипт посетит все подкаталоги и запуститсяnpm install
.Ниже представлен
.js
скрипт, который позволит добиться желаемого результата:Обратите внимание, что это пример из статьи StrongLoop, в которой конкретно рассматривается модульная
node.js
структура проекта (включая вложенные компоненты иpackage.json
файлы).Как было предложено, вы также можете добиться того же с помощью сценария bash.
РЕДАКТИРОВАТЬ: заставил код работать в Windows
источник
Я предпочитаю использовать пост-установку, если вы знаете имена вложенных подкаталогов. В
package.json
:источник
"postinstall": "cd nested_dir2 && npm install"
для каждой папки?Согласно ответу @Scott, сценарий install | postinstall - самый простой способ, если известны имена подкаталогов. Вот как я запускаю его для нескольких поддиректорий. Например, делать вид , что есть
api/
,web/
иshared/
суб-проекты в корне monorepo:источник
( )
для создания подоболочек и избеганияcd api && npm install && cd ..
.npm install
на верхнем уровне:"(cd was unexpected at this time."
Мое решение очень похоже. Чистый Node.js
Следующий сценарий проверяет все подпапки (рекурсивно), пока они есть,
package.json
и запускаетсяnpm install
в каждой из них. К нему можно добавить исключения: разрешенные папки не иметьpackage.json
. В приведенном ниже примере одна из таких папок - «пакеты». Его можно запустить как «предустановочный» скрипт.источник
Просто для справки, если люди сталкиваются с этим вопросом. Ты можешь сейчас:
npm install --save path/to/my/subfolder
источник
mkdir -p a/b ; cd a ; npm init ; cd b ; npm init ; npm install --save through2 ;
А теперь подождите ... вы просто вручную установили зависимости в "b", это не то, что происходит, когда вы клонируете новый проект.rm -rf node_modules ; cd .. ; npm install --save ./b
, Теперь перечислите node_modules, затем укажите b.Пример использования 1. Если вы хотите иметь возможность запускать команды npm из каждого подкаталога (где находится каждый package.json), вам нужно будет использовать
postinstall
.Как я и так часто использую
npm-run-all
, я использую его, чтобы он был красивым и коротким (часть после установки):Это дает дополнительное преимущество: я могу установить все сразу или по отдельности. Если вам это не нужно или вы не хотите использовать его
npm-run-all
как зависимость, посмотрите ответ demisx (используя подоболочки в postinstall).Вариант использования 2 : если вы будете запускать все команды npm из корневого каталога (и, например, не будете использовать сценарии npm в подкаталогах), вы можете просто установить каждый подкаталог, как и любую зависимость:
В последнем случае не удивляйтесь, что вы не найдете ни одного файла
node_modules
илиpackage-lock.json
в подкаталогах - все пакеты будут установлены в кореньnode_modules
, поэтому вы не сможете запускать свои команды npm (которые require dependencies) из любого из ваших подкаталогов.Если вы не уверены, вариант использования 1 всегда работает.
источник
run-p
не обязательно, но тогда он более подробный"postinstall": "npm run install:a && npm run install:b"
&&
безrun-p
. Но, как вы говорите, это менее читабельно. Другой недостаток (который решает run-p, потому что установки выполняются параллельно) заключается в том, что при сбое одного скрипта не пострадает ни один другой скриптДобавление поддержки Windows в ответ snozza , а также пропуск
node_modules
папки, если она есть.источник
Вдохновленный приведенными здесь сценариями, я создал настраиваемый пример, который:
yarn
илиnpm
yarn
но каталогpackage-lock.json
будет использовать толькоnpm
для этого каталога (по умолчанию true).cp.spawn
yarn workspaces
(настраиваемым)И при этом используются:
источник
Если у вас есть
find
утилита в вашей системе, вы можете попробовать запустить следующую команду в корневом каталоге вашего приложения:find . ! -path "*/node_modules/*" -name "package.json" -execdir npm install \;
По сути, найдите все
package.json
файлы и запуститеnpm install
в этом каталоге, пропуская всеnode_modules
каталоги.источник
find . ! -path "*/node_modules/*" ! -path "*/additional_path/*" -name "package.json" -execdir npm install \;