Jaki jest najbardziej poprawny sposób instalacji npm packages
w zagnieżdżonych podfolderach?
my-app
/my-sub-module
package.json
package.json
Jaki jest najlepszy sposób, aby mieć packages
w /my-sub-module
być instalowane automatycznie podczas npm install
uruchamiania w my-app
?
Odpowiedzi:
Jeśli chcesz uruchomić pojedyncze polecenie, aby zainstalować pakiety npm w zagnieżdżonych podfolderach, możesz uruchomić skrypt za pośrednictwem
npm
i mainpackage.json
w katalogu głównym. Skrypt odwiedzi każdy podkatalog i uruchomi sięnpm install
.Poniżej znajduje się
.js
skrypt, który osiągnie zamierzony efekt:Zauważ, że jest to przykład zaczerpnięty z artykułu StrongLoop, który dotyczy konkretnie modułowej
node.js
struktury projektu (w tym zagnieżdżonych komponentów ipackage.json
plików).Jak zasugerowano, możesz również osiągnąć to samo za pomocą skryptu bash.
EDYCJA: Kod działał w systemie Windows
źródło
Wolę używać po instalacji, jeśli znasz nazwy zagnieżdżonego podkatalogu. W
package.json
:źródło
"postinstall": "cd nested_dir2 && npm install"
dla każdego folderu?Zgodnie z odpowiedzią @ Scotta, skrypt install | postinstall jest najprostszym sposobem, o ile znane są nazwy podkatalogów. W ten sposób uruchamiam go dla wielu sub-reżerów. Na przykład, mamy udawać
api/
,web/
ashared/
podprojekty w korzeniu monorepo:źródło
( )
do tworzenia podpowłok i unikaniacd api && npm install && cd ..
.npm install
na najwyższym poziomie:"(cd was unexpected at this time."
Moje rozwiązanie jest bardzo podobne. Czysty Node.js
Poniższy skrypt sprawdza wszystkie podfoldery (rekurencyjnie), o ile mają
package.json
i działanpm install
w każdym z nich. Można dodać do niego wyjątki: foldery dozwolone, których nie można miećpackage.json
. W poniższym przykładzie jednym z takich folderów jest „pakiety”. Można go uruchomić jako skrypt "preinstalacyjny".źródło
Tylko w celach informacyjnych na wypadek, gdyby ludzie zetknęli się z tym pytaniem. Możesz teraz:
npm install --save path/to/my/subfolder
źródło
mkdir -p a/b ; cd a ; npm init ; cd b ; npm init ; npm install --save through2 ;
Teraz czekaj ... po prostu ręcznie zainstalowałeś zależności w "b", to nie jest to, co się dzieje, gdy klonujesz nowy projekt.rm -rf node_modules ; cd .. ; npm install --save ./b
. Teraz lista node_modules, a następnie lista b.Przypadek użycia 1 : Jeśli chcesz mieć możliwość uruchamiania poleceń npm z każdego podkatalogu (gdzie znajduje się każdy pakiet package.json), musisz użyć
postinstall
.Ponieważ i tak często używam
npm-run-all
, używam go, aby był ładny i krótki (część w postinstalacji):Ma to dodatkową zaletę, że mogę zainstalować wszystko naraz lub pojedynczo. Jeśli tego nie potrzebujesz lub nie chcesz
npm-run-all
jako zależności, sprawdź odpowiedź demisx (używając podpowłok w postinstall).Przypadek użycia 2 : Jeśli będziesz uruchamiać wszystkie polecenia npm z katalogu głównego (i na przykład nie będziesz używać skryptów npm w podkatalogach), możesz po prostu zainstalować każdy podkatalog tak, jak każdą zależną:
W tym drugim przypadku nie zdziw się, że nie znajdziesz żadnego pliku
node_modules
anipackage-lock.json
w podkatalogach - wszystkie pakiety zostaną zainstalowane w katalogu głównymnode_modules
, dlatego nie będziesz mógł uruchamiać poleceń npm (czyli wymagają zależności) z dowolnego podkatalogu.Jeśli nie masz pewności, przypadek użycia 1 zawsze działa.
źródło
run-p
nie jest konieczne, ale jest wtedy bardziej szczegółowe"postinstall": "npm run install:a && npm run install:b"
&&
bezrun-p
. Ale jak mówisz, jest to mniej czytelne. Inną wadą (to, że run-p rozwiązuje, ponieważ instalacje przebiegają równolegle) jest to, że jeśli jeden się nie powiedzie, żaden inny skrypt nie zostanie dotkniętyDodanie obsługi systemu Windows do odpowiedzi snozzy , a także pomijanie
node_modules
folderu, jeśli jest obecny.źródło
Zainspirowany dostarczonymi tutaj skryptami, zbudowałem konfigurowalny przykład, który:
yarn
lubnpm
yarn
ale katalog będzie miał tylko nazwę,package-lock.json
która będzie używananpm
dla tego katalogu (domyślnie true).cp.spawn
yarn workspaces
(konfigurowalne)A gdy jest używany:
źródło
Jeśli masz
find
narzędzie w swoim systemie, możesz spróbować uruchomić następujące polecenie w katalogu głównym aplikacji:find . ! -path "*/node_modules/*" -name "package.json" -execdir npm install \;
Zasadniczo znajdź wszystkie
package.json
pliki i uruchomnpm install
w tym katalogu, pomijając wszystkienode_modules
katalogi.źródło
find . ! -path "*/node_modules/*" ! -path "*/additional_path/*" -name "package.json" -execdir npm install \;