Napotkałem ciekawy problem - najwyraźniej niektóre moduły Node.js mają tak głębokie hierarchie folderów, że polecenie kopiowania systemu Windows (lub PowerShell, Copy-Item
którego w rzeczywistości używamy) trafia w niesławny błąd „ścieżka zbyt długa”, gdy ścieżka ma ponad 250 znaki długie.
Na przykład jest to hierarchia folderów, którą może utworzyć pojedynczy moduł Node:
node_modules\nodemailer\node_modules\simplesmtp\node_modules\
xoauth2\node_modules\request\node_modules\form-data\node_modules\
combined-stream\node_modules\delayed-stream\...
Wydaje się to szalone, ale jest rzeczywistością w przypadku modułów Node.
Musimy używać kopiuj-wklej podczas wdrażania (nie używamy "sprytnej" platformy docelowej, takiej jak Heroku, gdzie wdrożenie Git byłoby opcją) i jest to poważne ograniczenie w systemie Windows.
Czy nie ma polecenia npm lub czegoś, co skompaktowałoby node_modules
folder lub może zawierało tylko to, co jest faktycznie konieczne w czasie wykonywania? (Moduły węzłów zwykle zawierają test
foldery itp., Których nie musimy wdrażać). Czy masz inne pomysły, jak to obejść? Nieużywanie systemu Windows niestety nie wchodzi w grę :)
package.json
zdependencies
zestawem? Jeśli tak, czy możesz kopiować beznode_modules
i używać npm doinstall
lubupdate
zależności?npm install
w środowisku docelowym, działa poprzez tworzenie lokalnie „pakietu wdrożeniowego” (w zasadzie ZIP plus niektóre metadane), który jest następnie przesyłany na maszynę docelową, rozpakowywany i gotowe. Więc muszę dołączyćnode_modules
bezpośrednio.Odpowiedzi:
npm v3 (wydany niedawno) rozwiązuje ten problem poprzez spłaszczenie zależności. Sprawdź informacje o wydaniu tutaj w https://github.com/npm/npm/releases/tag/v3.0.0 w
flat flat
sekcji.I ostatni komentarz w tej sprawie https://github.com/npm/npm/issues/3697
źródło
flat flat
są teraz pochowane na innej stronie. Oto bezpośredni link: github.com/npm/npm/releases/tag/v3.0.0żeby dodać do tego ... kolejną rzeczą, która pomogła mi, była lista wszystkich zainstalowanych modułów z
npm ls
.co da ci drzewo modułów i wersji ... stamtąd łatwo jest zidentyfikować, które z nich są duplikatami ...
npm dedupe
nic dla mnie nie zrobiło. Nie jestem pewien, czy to błąd, czy co (Node v 10.16)Po zidentyfikowaniu zduplikowanego modułu zainstaluj go w katalogu głównym node_module przy użyciu
npm install [email protected] --save-dev
. Wersja jest ważna.potem wyczyściłem mój katalog node_modules i zrobiłem nowy
npm install
.Krótka wersja
npm ls
aby uzyskać listę wszystkich zainstalowanych modułów.npm install module@version --save-dev
aby zainstalować te moduły w katalogu głównym node_modules i zaktualizować plik package.json.rmdir node_modules
aby usunąć katalog node_modules.npm install
aby ściągnąć nową kopię swoich zależności.Kiedy to zrobiłem, wszystko było znacznie czystsze.
Polecam również skomentowanie pliku package.json, aby pokazać, które z nich zostały sprowadzone w celu spłaszczenia drzewa node_modules.
źródło
Nie sądzę, aby było jakieś świetne rozwiązanie, biorąc pod uwagę twoje ograniczenia, ale oto kilka rzeczy, które mogą pomóc.
npm dedupe
aby zoptymalizować hierarchię katalogów, co może skrócić niektóre ścieżkinpm install --production
do instalacji bez narzędzi programistycznychnode_modules
kataloguyour_project/node_modules/pkg_with_deep_deps
, który pozwoli im mieć wystarczająco krótkie ścieżki, ale nadal będą działać. Więc to będzieyour_project/node_modules/pkg_with_deep_deps/node_modules
.require
powinienem być w stanie znaleźć je poprawnie w czasie wykonywania. Musisz tylko jasno udokumentować, co ręcznie zmieniłeś, dlaczego to zrobiłeś i zachować swoje własne prawdziwe zależności dokładnie przedstawione wpackage.json
Oto dyskusja na githubie, która szczegółowo omawia ten problem.
źródło
dedupe
(w ogóle o tym nie wiedziałem) i--production
(npm install -h
nie pokazałem tej opcji)! Korzystanie z archiwum ZIP niestety nie wchodzi w grę, patrz komentarz powyżej.Napisałem moduł węzła o nazwie „npm-flatten”, który spłaszcza twoje zależności tutaj: https://www.npmjs.org/package/npm-flatten
Jeśli szukasz dystrybucji, napisałem również pakiet NuGet, który zintegruje pełne środowisko node.js z projektem .NET tutaj: http://www.nuget.org/packages/NodeEnv/
Opinie byłyby mile widziane.
źródło
Pomogło mi mapowanie dysku lokalnego do mojego folderu Node.js:
użycie sieci n: \ nazwa komputera \ c $ \ użytkownicy \ moja nazwa \ dokumenty \ node.js / persistent: tak
Przed: c: \ użytkownicy \ moja nazwa \ dokumenty \ node.js \ nazwa projektu (45 znaków) Po: n: \ nazwa projektu (14 znaków, czyli o 31 znaków mniej)
W wielu przypadkach pozwalało to na zainstalowanie niektórych modułów.
Powiem, że właśnie dzisiaj ponownie odkryłem ten problem, kiedy próbowałem wykonać kopię zapasową całego mojego kodu na dysku USB.
„C: \ Users \ myname \ Documents \ Node.js \ angular-phonecat \ node_modules \ karma \ node_modules \ chokidar \ node_modules \ anymatch \ node_modules \ micromatch \ node_modules \ regex-cache \ node_modules \ benchmarked \ node-reader_modules \ node_modules \ extension-shallow \ benchmark \ fixtures jest za długa. "
Nawet gdy próbowałem wykonać ich kopię zapasową za pomocą litery N: dysku, w niektórych przypadkach nadal nie udawało się to z powodu długości ścieżek, ale wystarczyło, aby naprawić powyższy.
źródło
1) Podczas kompilacji wydania można zapobiec skanowaniu tych plików / folderów przez program Visual Studio, ustawiając właściwości folderu jako folder ukryty (WYSTARCZY ustaw go na node_modules). Źródła: http://issues.umbraco.org/issue/U4-6219#comment=67-19103
2) Możesz wykluczyć pliki lub foldery, które są publikowane podczas pakowania, dołączając następujący węzeł XML do pliku CsProject.
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> ... <OutputPath>bin\</OutputPath> <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn> <ExcludeFilesFromDeployment>File1.aspx;File2.aspx</ExcludeFilesFromDeployment> <ExcludeFoldersFromDeployment>Folder1;Folder2</ExcludeFoldersFromDeployment> </PropertyGroup>
źródło
Znalazłem jedno rozwiązanie z Microsoft node.js wytycznych .
> npm install -g rimraf
usuń pliki, które przekraczająmax_path
> npm dedupe
przenosi zduplikowane pakiety na najwyższy poziom> npm install -g flatten-packages
przenosi wszystkie pakiety na najwyższy poziom, ale może powodować problemy z wersjonowaniemnpm@3
którego próbuje się dokonaćnode_modules
hierarchię folderów maksymalnie płaską.> npm install –g npm-windows-upgrade
źródło
To nie jest właściwe rozwiązanie, raczej obejście, gdy się spieszysz, ale możesz użyć 7-Zip, aby spakować folder, przenieść spakowany plik i rozpakować go bez żadnego problemu.
Wykorzystaliśmy to rozwiązanie do wdrożenia aplikacji Node.js, w której nie można było przeprowadzić czystej instalacji npm.
źródło