Lokalna zależność w pakiecie.json


453

Chcę zrobić coś takiego, więc npm installinstaluje również package.jsonz ../somelocalliblub co ważniejsze jego zależnościami.

"dependencies": {
    "express": "*",
    "../somelocallib": "*"
}

Odpowiedzi:


583

npm> = 2.0.0

Ta funkcja została zaimplementowana w wersji 2.0.0 npm. Przykład:

{
  "name": "baz",
  "dependencies": {
    "bar": "file:../foo/bar"
  }
}

Każda z następujących ścieżek jest również poprawna:

../foo/bar
~/foo/bar
./foo/bar
/foo/bar

Pakiet lokalny zostanie skopiowany do prefiksu ( ./node-modules).

npm <2.0.0

Umieść jak zwykle somelocallibzależność package.json:

"dependencies": {
  "somelocallib": "0.0.x"
}

Następnie uruchom, npm link ../somelocalliba npm zainstaluje wersję, nad którą pracujesz, jako dowiązanie symboliczne .

app@0.0.1 /private/tmp/app
└── somelocallib@0.0.1 -> /private/tmp/somelocallib

Odniesienie: link (1)


3
Jak możemy to rozłączyć?
AtaurRehman Asad

13
Wadą instalacji pakietów lokalnych z „linkiem npm” jest to, że dostajesz dużo duplikacji modułów. Kiedy podajesz listę swoich zależności w „module: version” lub „module: git-repo”, algorytm instalacji npm unika instalowania pakietu, który jest już zainstalowany w pakiecie nadrzędnym. Tak więc z „npm link”, jeśli twoja główna aplikacja zależy od „async@0.8.0”, a wszystkie twoje lokalne pakiety również zależą od „async@0.8.0”, zakończysz instalowanie wszystkich lokalnych pakietów „async@0.8. 0 ”zamiast używania tej samej zainstalowanej wersji„ asynchronicznej ”głównej aplikacji. Nie dzieje się tak przy użyciu „folderu instalacyjnego npm”.
Pedro Ballesteros

3
@PedroBallesteros możesz użyć npm dedupdo rozwiązania tego problemu. npmjs.org/doc/cli/npm-dedupe.html
danilopopeye

4
Wydaje się, że „pakiet lokalny zostanie skopiowany ...” w przypadku nowszej wersji npm. Teraz tworzone jest dowiązanie symboliczne.
tsauerwein

2
@danilopopeye Według docs.npmjs.com/cli/install npm install <folder> opis mówi: Zainstaluj pakiet w katalogu jako dowiązanie symboliczne w bieżącym projekcie.
Herman J. Radtke III

211

Można teraz bezpośrednio określić lokalne ścieżki instalacji modułów węzła package.json. Z dokumentów:

Lokalne ścieżki

Od wersji 2.0.0 możesz podać ścieżkę do lokalnego katalogu zawierającego pakiet. Ścieżki lokalne można zapisać za pomocą npm install -Slub npm install --saveprzy użyciu dowolnej z następujących form:

../foo/bar
~/foo/bar
./foo/bar
/foo/bar

w takim przypadku zostaną znormalizowane do ścieżki względnej i dodane do Twojej package.json. Na przykład:

{
  "name": "baz",
  "dependencies": {
    "bar": "file:../foo/bar"
  }
}

Ta funkcja jest pomocna przy tworzeniu lokalnego trybu offline i tworzeniu testów, które wymagają instalacji npm tam, gdzie nie chcesz trafić na serwer zewnętrzny, ale nie należy jej używać podczas publikowania pakietów w rejestrze publicznym.


23
W npm v.3 + normalizacja jest absolutna, a nie względna , więc zobaczysz coś w stylu"bar": "file:///home/user/src/foo/bar"
Ron Wertlen

27
Jak zaktualizować zależność ścieżki lokalnej bez zwiększania wersji?
Bohdan Lyzanets

3
Nawiasem mówiąc, powoduje to wszelkiego rodzaju problemy, gdy i / lub próbujesz dokować aplikację węzła, ponieważ standardowe node:onbuildobrazy kopiują tylko bieżący katalog, a tym samym pomijają wszystko ../foo.
donmartin

4
czy jest jakiś sposób na zintegrowanie tego z git + ssh, aby można było mieć lokalną kopię repozytorium git, npm installz którego pochodzi, lub inne repozytorium git w sieci LAN? Kiedy próbuję powyższej i npm zainstalować z git + ssh, wygląda na to, że zajrzał do katalogu node_modules i nie próbował przejść przez git + ssh, mimo że tak właśnie instaluję pakiet najwyższego poziomu.
Michael

1
Instalowanie pracy. Ale w ten sposób otrzymam komunikat „Nie znaleziono błędu” podczas próby zaimportowania modułu do mojego projektu.
C4d

87

To działa dla mnie.

Umieść następujące elementy w pliku package.json

"scripts": {
    "preinstall": "npm install ../my-own-module/"
}

4
Dzięki za sugestię, która nie wymaga użycia „linku npm”
ItalyPaleAle

Usunął się .gitignorew folderze modułu, utworzył .npmignorei przy pierwszym uruchomieniu zastosował 777 rekurencyjnie na wszystkich folderach oprócz node_modules. Ale tak, zainstalował zależności. Używanie npm w wersji 1.4.14.
L0LN1NJ4

użyłem tego, ale zamiast zadzierać z modułami node_modules użyłem app_modules
catalint

1
Dlaczego nie "dependencies": { "my-own-module": "file:../my-own-module" }?
Bohdan Lyzanets

1
Zgadzam się z @Bohdan tutaj. lokalne zależności zrobią dokładnie to samo. Zaletą korzystania z niego npm linkjest to, że nie trzeba tego robić za npm installkażdym razem, aby aktualizować zależności.
froginvasion

30

Jeśli chcesz dalej to zautomatyzować, ponieważ sprawdzasz moduł w kontroli wersji i nie chcesz polegać na pamiętaniu przez programistów linku npm, możesz dodać to do sekcji „skryptów” package.json:

"scripts": {
    "postinstall": "npm link ../somelocallib",
    "postupdate": "npm link ../somelocallib"
  }

Wydaje się to nie do zniesienia, ale wydaje się, że „działa”. Mam wskazówkę dotyczącą tego problemu npm: https://github.com/npm/npm/issues/1558#issuecomment-12444454


15
Dlaczego postinstalli postupdatezamiast preinstalli preupdate?
prawej

1
Czy możesz wyjaśnić nieco więcej, co to robi. tzn. jeśli skonfiguruję projekt vscode z wieloma folderami głównymi (tj. „obszarem roboczym z wieloma katalogami głównymi”), czy będzie on w stanie natychmiast odzwierciedlić zmiany w folderze modułu dla zużywających się projektów? - Czy o to chodzi w tym hacku?
bvdb

26

W ten sposób dodasz zależności lokalne:

npm install file:src/assets/js/FILE_NAME

Dodaj go do package.json z NPM:

npm install --save file:src/assets/js/FILE_NAME

Dodaj bezpośrednio do package.json w następujący sposób:

....
  "angular2-autosize": "1.0.1",
  "angular2-text-mask": "8.0.2", 
  "animate.css": "3.5.2",
  "LIBRARY_NAME": "file:src/assets/js/FILE_NAME"
....

6

Projekt główny

Oto pakiet.json, którego będziesz używać w projekcie głównym:

"dependencies": {
    "express": "*",
    "somelocallib": "file:./somelocallib"
}

Tam ./somelocallibjest odwołanie do folderu biblioteki w stosunku do głównego projektu paczka.json .

Odniesienie: https://docs.npmjs.com/files/package.json#local-paths


Podprojekt

Obsługuj zależności biblioteki.

Oprócz biegania npm installbędziesz musiał uruchomić (cd node_modules/somelocallib && npm install).

Jest to znany błąd związany z NPM.

Odniesienie: https://github.com/npm/npm/issues/1341 (szukając bardziej aktualnego odniesienia)


Uwagi dla dokera

Zwróć się do swojego mistrza package.locki somelocallib/package.lockdo menedżera kodu źródłowego.

Następnie użyj pliku Docker:

FROM node:10
WORKDIR /app
# ...
COPY ./package.json ./package-lock.json ./
COPY somelocallib somelocallib
RUN npm ci
RUN (cd node_modules/zkp-utils/ && npm ci)
# ...

Używam nawiasów w moich (cd A && B)konstrukcjach, aby uczynić operację idempotentną.


3

Wiem, że to npm install ../somelocallibdziała.

Nie wiem jednak, czy składnia wyświetlana w pytaniu będzie działać od package.json...

Niestety, doc wydaje się wspomnieć tylko o URL jako zależności.

Spróbuj file:///.../...tar.gz, wskazując na skompresowaną bibliotekę lokalną ... i powiedz nam, czy działa.


1
Dodam „zależności”: {„somemodule”: „plik: ///./internal_modules/somemodule”} do package.json. To nie działa Kod błędu to „npm ERR! Code E404”.
Jeffrey,

2

To działało dla mnie: najpierw upewnij się, że katalogi npm mają odpowiedniego użytkownika

sudo chown -R myuser ~/.npm
sudo chown -R myuser /usr/local/lib/node_modules

Następnie w katalogu package.json połącz katalog

"scripts": {
 "preinstall": "npm ln mylib ../../path/to/mylib"
}, 
"dependencies": {
  "mylib" : "*"
}

2
Dowiązania symboliczne w systemie Windows są możliwe od XP en.wikipedia.org/wiki/NTFS_symbolic_link . Otwórz wiersz poleceń jako administrator, a następnie uruchom npm install.
sod

2

Właściwie, począwszy od npm 2.0, istnieje teraz obsługa lokalnych ścieżek (patrz tutaj ).


8
Michael Trouw udzielił już tej odpowiedzi kilka tygodni wcześniej, więc po co powielać?
Dan Dascalescu

2

Ciekawe ... przynajmniej w systemie Windows (mój npm to 3. coś) Musiałem zrobić:

"dependencies": {
 "body-parser": "^1.17.1",
 "module1": "../module1",
 "module2": "../module2",

Kiedy to zrobiłem npm install ../module1 --save, powstały ścieżki bezwzględne, a nie względne według dokumentacji.

Pomyślałem trochę więcej i uznałem, że ../xxxto wystarczy.

Konkretnie mam moduły węzłów lokalnych sprawdzone, aby powiedzieć d: \ build \ module1, d: \ build \ module2 i mój projekt węzła (aplikacji) w d: \ build \ nodeApp.

Aby „zainstalować”:

d:\build\module1> rmdir "./node_modules" /q /s && npm install
d:\build\module2> rmdir "./node_modules" /q /s && npm install
d:\build\nodeApp> rmdir "./node_modules" /q /s && npm install

Pakiet.json modułu 1 ma zależność „moduł2”: „../module2”; moduł2 nie ma zależności lokalnej; nodeApp ma zależności „moduł1”: „../module1” i „moduł2”: „../module2”.

Nie jestem pewien, czy to działa tylko dla mnie, ponieważ wszystkie 3 foldery (moduł1, ​​moduł2 i nodeApp) znajdują się na tym samym poziomie .......


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.