Instalujesz moduł lokalny przy użyciu npm?

418

Mam pobrane repozytorium modułu, chcę zainstalować go lokalnie, a nie globalnie w innym katalogu?

Jak to łatwo zrobić?

fantazyjny
źródło

Odpowiedzi:

479

Z dokumentacji npm-link :

W lokalnym katalogu modułów:

$ cd ./package-dir
$ npm link

W katalogu projektu, aby użyć modułu:

$ cd ./project-dir
$ npm link package-name

Lub za jednym razem, używając ścieżek względnych:

$ cd ./project-dir
$ npm link ../package-dir

Jest to równoważne z użyciem dwóch poleceń powyżej pod maską.

Rich Apodaca
źródło
14
To jedyne rozsądne podejście, jakie do tej pory widziałem - dlaczego npm musi być tak niejasny / tępy. jeśli chodzi o tworzenie lokalnego pakietu, instalowanie go, a następnie korzystanie z niego, nie wiem ... link działa (i świetnie), ale terminologia jest dość myląca.
smaudet,
6
@Rich Apodaca, dzięki za link do dokumentu. Nie wspomina o cofnięciu procesu. Wygląda na to, że wszystko, co robi, to tworzenie dowiązań symbolicznych, więc mogę je usunąć jak zwykle?
Tyler Collier
1
@TylerCollier npm unlink wydaje się być operacją obrazu lustrzanego stackoverflow.com/a/24940024/54426
Rich Apodaca
1
Tylko uwaga, jeśli używasz Angular2 (a może innych aplikacji?), Jest trochę szumu wokół linkowania npm będącego główną przyczyną konkretnego rodzaju problemu. Przykład tutaj i tutaj
The Red Pea
4
Należy jednak pamiętać, że npm linkspowoduje to drugie wystąpienie zależności zewnętrznych. Jeśli więc masz pakiet A, potrzebujesz B i C, B potrzebuje C. Łączenie B spowoduje, że aplikacja A będzie miała dwie instancje C.
użytkownik2167582
421

podasz tylko jeden <folder>argument npm install, argument powinien wskazywać na folder lokalny zamiast nazwy pakietu:

npm install /path
fantazyjny
źródło
5
W przeciwieństwie do linku, używa .npmignore.
Camille Wintz,
30
@ bithavoc Przynajmniej od npm 5, instalacja folderu tworzy teraz dowiązanie symboliczne, a nie kopię. Zobacz docs.npmjs.com/cli/install
Frank Tan,
3
Próbowałem użyć w ten sposób, ale mój moduł nie może znaleźć swoich peerDependencies.
Witalo Benicio
1
miło jest rm -rf node_modulesprzed i npm installpo uruchomieniu skryptu odpowiedzi.
Renato Back,
2
@FrankTan Tak, ale jak zdobyć stare zachowanie? I chcą kopię!
Michael
150

Ponieważ zapytany i udzielony przez tę samą osobę, dodam link npm jako alternatywę.

z dokumentów:

Jest to przydatne do instalowania własnych rzeczy, dzięki czemu można nad nimi pracować i testować iteracyjnie bez konieczności ciągłej przebudowy.

cd ~/projects/node-bloggy  # go into the dir of your main project
npm link ../node-redis     # link the dir of your dependency

[Edytuj] Począwszy od NPM 2.0, możesz zadeklarować lokalne zależności w pliku package.json

"dependencies": {
    "bar": "file:../foo/bar"
  }
Luke W.
źródło
11
To może nie być pierwotna intencja pytania, ale prawdopodobnie tego właśnie chce większość osób, które znajdują to w Google.
Dusty J
1
Ta odpowiedź wydaje się niekompletna, musisz npm linkraz uruchomić na folderze (aby utworzyć globalne łącze symboliczne), a następnie uruchomić npm link package-namew folderze projektu (aby użyć globalnego łącza symbolicznego w projekcie). Odpowiedź poniżej jest właściwą odpowiedzią.
Thomas Potaire,
8
@ThomasPotaire obie odpowiedzi są poprawne. Jeśli spojrzysz na dokumentację łącza npm, przedstawia ona obie metody, z tym względnym podejściem do katalogu jako skrótem.
MJ
1
Druga metoda (wykorzystująca file:podejście) pozwoliła mojej aplikacji i modułowi lokalnemu na współdzielenie zależności. Mój test npm linkdał w wyniku zduplikowaną zależność, która psuje rzeczy, jeśli zależność musi być używana jako singleton.
Daniel Waltrip
Miałem pakiet lokalny (powiedzmy pakiet1), pakiet2 ma wspomnianą zależność ze względną ścieżką pakietu1. npm, że nie instaluję pakietu, gdy ścieżka względna zaczyna się od „file: ../../ package1”, działa, gdy jest to „” ../../package1 ”, czy dodawanie pliku na początku oznacza coś jeszcze?
Dip686
16

npm pack + package.json

Oto, co zadziałało dla mnie:

KROK 1: W module project, wykonaj npm pack:

Spowoduje to utworzenie <package-name>-<version>.tar.gzpliku.

KROK 2: Przenieś plik do consumer project

Idealnie możesz umieścić wszystkie takie pliki w tmpfolderze w consumer-projectkatalogu głównym:

KROK 3: Poleć to w swoim package.json:

"dependencies": {
  "my-package": "file:/./tmp/my-package-1.3.3.tar.gz"
}

KROK 4: Installpakiety:

npm installlub npm ilubyarn

Twoja paczka powinna być dostępna w twoim consumer-project's node_modulesfolderze.

Powodzenia...

Akash
źródło
9

Żadne z tych podejść ( npm linklub package.jsonzależności plików) nie działa, jeśli moduł lokalny ma zależności równorzędne, które chcesz zainstalować tylko w zakresie projektu.

Na przykład:

/local/mymodule/package.json:
  "name": "mymodule",
  "peerDependencies":
  {
    "foo": "^2.5"
  }

/dev/myproject/package.json:
  "dependencies":
  {
    "mymodule": "file:/local/mymodule",
    "foo": "^2.5"
  }

W tym scenariuszu KMP ustanawia myproject„s node_modules/tak:

/dev/myproject/node_modules/
  foo/
  mymodule -> /local/mymodule

Kiedy węzeł ładuje się mymodulei robi to require('foo'), węzeł rozpoznaje mymoduledowiązanie symboliczne, a następnie szuka tylko /local/mymodule/node_modules/(i jego przodków) foo, których nie znalazł. Zamiast tego chcemy zajrzeć do węzła /local/myproject/node_modules/, ponieważ tam właśnie uruchamiany był nasz projekt i gdzie foojest zainstalowany.

Tak, my też potrzebujemy sposobu, aby powiedzieć węzeł nie rozwiązać ten symboliczny szuka foo, albo musimy znaleźć sposób, aby powiedzieć KMP zainstalować kopię na mymodulekiedy składnia zależność plik jest używany w package.json. Niestety nie znalazłem sposobu na zrobienie tego :(

Paul Medynski
źródło
Znalazłem obejście, którym jest ustawiony NODE_PATH, aby wskazywał node_modules/, gdzie foojest zainstalowany. Tak więc w powyższym przypadku byłoby to: NODE_PATH=/dev/myproject/node_modules/ Pozwala mymoduleto znaleźć foo.
Paul Medynski
Istnieje rozwiązanie dla. Umieść moduły zależności w folderze głównym projektu . Zdefiniuj swoje zależności w pliku package.json za pomocą zwykłego przedrostka „file:” . Do npm i Spowoduje to utworzenie dowiązania symbolicznego w module node_module, a jego zależności mogą zostać podniesione do najwyższych poziomów modułów node_modu, tak jak w przypadku innych typów zależności. Moja wersja npm to v6.14.4. Po spędzeniu kilku godzin na tym, jak to naprawić, znalazłem to rozwiązanie tutaj: ( atmosfera.washington.edu/~nbren12/reports/journal/… ). Dzięki nbren12.
sasebot
Miałem te same problemy. Znalazłem tę odpowiedź: stackoverflow.com/questions/50807329/… , to rozwiązuje mój problem z zależnościami równorzędnymi i bibliotekami lokalnymi.
theawless
0

Brakuje głównej nieruchomości?

Jak odpowiedzieli poprzedni ludzie npm --save ../location-of-your-packages-root-directory. ../location-of-your-packages-root-directoryJednak musi mieć dwie rzeczy w celu użycia go do pracy.

1) package.jsonw tym katalogu wskazanym na

2) mainwłaściwość package.jsonmusi być ustawiona i działa ig, "main": "src/index.js",jeśli plik wejściowy dla ../location-of-your-packages-root-directoryto../location-of-your-packages-root-directory/src/index.js

K - Toksyczność w SO rośnie.
źródło