Jak zainstalować prywatny moduł NPM bez mojego rejestru?


329

Wziąłem wspólny kod i umieściłem go w module NPM, którego nie chcę przesyłać do centralnego rejestru. Pytanie brzmi: jak zainstalować go z innych projektów?

Oczywistym sposobem jest prawdopodobnie utworzenie własnego rejestru NPM, ale zgodnie z dokumentacją wiąże się to z wieloma problemami.

Czy mogę po prostu zainstalować moduł NPM, który znajduje się w lokalnym systemie plików, a może nawet z git?

npm install --from-git git@server:project

Odpowiedzi:


262
cd somedir
npm install .

lub

npm install path/to/somedir

somedirmusi zawierać package.jsonwnętrze.

Wie też o git:

npm install git://github.com/visionmedia/express.git

4
Rozwiązanie typu ścieżka / do / somedir działa, ale jest to trochę okropne, ponieważ wszystkie instrukcje wymagają muszą zawierać ścieżkę względną lub bezwzględną. Proszę mnie poprawić, jeśli robię coś źle ...
Luke Bayes

3
@Luke tak, mylisz się. Po npm installskopiowaniu wszystkich plików do katalogu projektu. Tak więc ścieżki w requireinstrukcjach będą względne tylko do katalogu projektu.
mihai,

4
Jestem zdezorientowany w górnej części i jedynym powodem, dla którego sam tego nie testowałem, jest to, że wciąż się uczę i nie mam prywatnego modułu do pracy. W każdym razie, zmieniając katalog na miejsce, w którym znajduje się moduł, a następnie wywołując, installczy to nie wystarczy zainstalować tam, a nie dla projektu, do którego chcesz go użyć?
Adam Beck

11
Uwaga dodatkowa: (a) w przypadku korzystania z repozytoriów git można określić gałąź / zatwierdzenie / znacznik, dodając #<ref>na końcu adresu URL git, np . git://github.com/visionmedia/express.git#v0.0.1; (b) Dla bezpieczeństwa dodaj "private": truedo pliku package.json swoich prywatnych repozytoriów. Dzięki temu npm nigdy nie pozwoli ci przypadkowo opublikować swojego tajnego sosu w oficjalnym rejestrze npm. (według debuggable.com/posts/… )
Rafael Xavier

9
FYI, jeśli podajesz swój duplikat przez http, musisz, npm i git+http://all/the/things.gitmimo że git clone http://all/the/things.gitdziała dobrze
slf

527

W swoich prywatnych modułach npm dodaj

"private": true 

do pliku package.json

Następnie, aby odwołać się do modułu prywatnego w innym module, użyj tego w pliku package.json

{
    "name": "myapp",
    "dependencies": {
        "private-repo": "git+ssh://git@github.com:myaccount/myprivate.git#v1.0.0",
    }
}

59
To jest prawdziwa poprawna odpowiedź, jeśli chcesz, aby plik package.json utrzymywał prywatną listę zależności repo, co jest dobrą rzeczą (tm), którą powinieneś robić.

6
W tym przykładzie odwołuje się do określonego znacznika, ale jeśli go nie masz, domyślnie nadrzędny. (patrz git-scm.com/book/en/Git-Basics-Tagging )
250R

4
Nie rozumiem, w jaki sposób ten wiersz poleceń może pobrać kod z prywatnego repozytorium github, jeśli nie podam moich danych uwierzytelniających! Jak mogę przekazać moje dane uwierzytelniające github?
Renato Gama,

28
Pamiętaj, że ta "private": trueczęść nie jest konieczna, ale pomoże zapobiec przypadkowemu opublikowaniu twojego prywatnego repo w publicznym rejestrze npm.
evanrmurphy

2
npm szuka również kilku zmiennych środowiskowych. W podręczniku w npm install <git remote url>sekcji znajdują się opcje takie jak GIT_ASKPASSi. GIT_SSHPrzykładowe użycie, aby wybrać inny klucz niż domyślny id_rsa:GIT_SSH_COMMAND='ssh -i ~/.ssh/custom_ident' npm install git+ssh://git@github.com:npm/npm.git
Jasmine Hegman,

62

Czy mogę po prostu zainstalować pakiet NPM, który znajduje się w lokalnym systemie plików, a może nawet z git?

Tak, możesz! Z dokumentacji https://docs.npmjs.com/cli/install

Pakiet to:

  • a) folder zawierający program opisany przez plik package.json
  • b) skompresowane archiwum zawierające (a)
  • c) adres URL, który jest rozwiązywany do (b)
  • d) a, <name>@<version>który jest opublikowany w rejestrze za pomocą (c)
  • e) a, <name>@<tag>który wskazuje na (d)
  • f) a <name> który ma „najnowszą” etykietę spełniającą kryteria (e)
  • g) a, <git remote url>który rozwiązuje do (b)

Czy npm nie jest genialny?


2
Zauważ, że jeśli wybierzesz opcję b), to tak naprawdę musi to być skompresowany plik archiwalny, zwykłe archiwum zip tego nie zrobi. Tj. Jeśli utworzysz swój pakiet za pomocą tar -czf my-package.tar.gz dist(zakładając, że twój distfolder zawiera również odpowiedni package.jsonplik), możesz to zrobić npm install ../my-lib/my-package.tar.gzz innego projektu.
Dániel Kis-Nagy

48

Aktualizacja ze stycznia 2016 r

Oprócz innych odpowiedzi czasami zdarza się scenariusz, w którym chcesz mieć prywatne moduły dostępne w kontekście zespołu.

Zarówno Github, jak i Bitbucket obsługują koncepcję generowania klucza API zespołu . Tego klucza interfejsu API można użyć jako hasła do wykonywania żądań interfejsu API w ramach tego zespołu.

W swoich prywatnych modułach npm dodaj

"private": true 

do pliku package.json

Następnie, aby odwołać się do modułu prywatnego w innym module, użyj tego w pliku package.json

    {
        "name": "myapp",
        "dependencies": {
            "private-repo":
"git+https://myteamname:aQqtcplwFzlumj0mIDdRGCbsAq5d6Xg4@bitbucket.org/myprivate.git",
        }
    }

gdzie nazwa zespołu = nazwa myteam , a klucz API = aQqtcplwFzlumj0mIDdRGCbsAq5d6Xg4

Odnoszę się tutaj do repozytorium bitbucket, ale jest ono prawie identyczne również w przypadku github.

Wreszcie, alternatywnie, jeśli naprawdę nie masz nic przeciwko płaceniu 7 USD miesięcznie ( od momentu pisania), możesz teraz mieć prywatne moduły NPM od razu po wyjęciu z pudełka.


Czy możesz tego użyć, jeśli chcesz mieć moduł globalny?
PI.

Obawiam się, że to nie działa. Zarówno zdalny, jak i repozytorium nie zostały znalezione. Jakieś pomysły?
Thomas Bormans

@ThomasBormans - nadal masz problemy? Wklej (zmieszaj nazwę swojej drużyny / klucz API) jako swój wiersz w sekcji zależności w pliku package.json - zgodnie z powyższymi instrukcjami. Przekonałem się, że działa to dobrze zarówno dla prywatnych repozytoriów github, jak i bitbucket. Z którego korzystasz
arcseldon

@arcseldon „nazwa”: „git + klucz: x-oauth-basic@bitbucket.org/user/repo.git zwraca EISDIR: nielegalna operacja na katalogu, przeczytaj . A „nazwa”: „git + użytkownik: klucz@bitbucket.org/repo.git zwraca kilka błędów, w tym te słowa zdalne: Nie znaleziono, błąd: repozytorium, Polecenie nie powiodło się: klon git . Jakieś pomysły?
Thomas Bormans,

Spróbuj postępować zgodnie z „dokładnym” formatem, który podałem w odpowiedzi: „git + https: // <nazwa_mytego>: <mój_klucz> @ bitbucket.org / <nazwa_repo> .git Jak wygenerowałeś klucz API? jest to poprawne w ustawieniach bitbucket ... przepraszam, że pytam o oczywistość, ale mam prawie 100% pewności, że to powinno zadziałać
arcseldon

30

FWIW: Miałem problemy z tymi wszystkimi odpowiedziami, gdy miałem do czynienia z repozytorium organizacji prywatnej.

Dla mnie działało:

npm install -S "git+https://username@github.com/orgname/repositoryname.git"

Na przykład:

npm install -S "git+https://blesh@github.com/netflix/private-repository.git"

Nie jestem do końca pewien, dlaczego inne odpowiedzi nie działały dla mnie w tym jednym przypadku, ponieważ to były te, które wypróbowałem najpierw, zanim trafiłem do Google i znalazłem tę odpowiedź. Inne odpowiedzi są tym, co zrobiłem w przeszłości.

Mam nadzieję, że pomoże to komuś innemu.


2
Czy możesz użyć podfolderu git repo?
Chris

Pracował dla mnie w 2019 roku! Ale musiałem upewnić się, że git ma poświadczenia dostępu do tego konta. (Np. Przetestuj git dwukrotnie klonując https://i upewnij się, że hasło nie jest potrzebne przy drugim uruchomieniu. W takim razie możesz zacząć!)
joeytwiddle

9

Miałem ten sam problem i po kilku poszukiwaniach znalazłem Reggie ( https://github.com/mbrevoort/node-reggie ). Wygląda całkiem solidnie. Pozwala na lekkie publikowanie modułów NPM na prywatnych serwerach. Nie jest idealny (brak uwierzytelnienia po instalacji), i wciąż jest bardzo młody, ale przetestowałem go lokalnie i wydaje się, że robi to, co według niego powinien zrobić.

To jest ... (i to tylko z ich dokumentów)

npm install -g reggie
reggie-server -d ~/.reggie

następnie cd do katalogu modułu i ...

reggie -u http://<host:port> publish 
reggie -u http://127.0.0.1:8080 publish 

wreszcie możesz zainstalować pakiety z reggie, używając tego adresu URL albo w bezpośrednim poleceniu instalacji npm, albo w pliku package.json ...

npm install http://<host:port>/package/<name>/<version>
npm install http://<host:port>/package/foo/1.0.0

lub..

dependencies: {
    "foo": "http://<host:port>/package/foo/1.0.0"
}

7

Zbuduj swój kod w przystępny sposób, jak poniżej. Jeśli to jest możliwe dla ciebie.

  • NodeProjs \ Apps \ MainApp \ package.json

  • NodeProjs \ Modules \ DataModule \ package.json

W MainApp @ NodProjs \ Apps \ MainApp \

npm install --S ../../Modules/DataModule

Konieczne może być zaktualizowanie pliku package.json jako:

 "dependencies": {
       "datamodule": "../../Modules/DataModule"
}

To zadziałało w mojej sytuacji.


5

Npm zapewnia obecnie nieograniczoną liczbę prywatnych modułów hostowanych za 7 USD / użytkownika / miesiąc

cd private-project
npm login

w twoim pakiecie json "name": " @username/private-project"

npm publish

następnie, aby wymagać projektu:

cd ../new-project
npm install --save @username/private-project

1
Czy wymaga to kroku logowania po stronie klienta?
Aidan Hoolachan

Jaka jest alternatywa dla tego? Na przykład, jeśli chcesz hostować swój „pakiet” na S3 i wyciągać stamtąd.
Con Antonakos

4

Zaczynając od odpowiedzi arcseldon , stwierdziłem, że w adresie URL potrzebna była nazwa zespołu:

npm install --save "git+https://myteamname@aQqtcplwFzlumj0mIDdRGCbsAq5d6Xg4@bitbucket.org/myteamname/myprivate.git"

I pamiętaj, że klucz API jest dostępny tylko dla zespołu, a nie dla poszczególnych użytkowników.


2

Skonfiguruj instalację z publicznego repozytorium Github, nawet jeśli maszyna jest pod firewallem:

dependencies: {
   "foo": "https://github.com/package/foo/tarball/master"
}

2

Używam następujących elementów z prywatnym repozytorium github:

npm install github:mygithubuser/myproject

2

Właśnie tego szukałem :

# Get the latest from GitHub, public repo:
$ npm install username/my-new-project --save-dev
# Bitbucket, private repo:
$ npm install git+https://token:x-oauth-basic@github.com/username/my-new-project.git#master
$ npm install git+ssh://git@github.com/username/my-new-project.git#master

#  or from Bitbucket, public repo:
$ npm install git+ssh://git@bitbucket.org/username/my-new-project.git#master --save-dev
# Bitbucket, private repo:
$ npm install git+https://username:password@bitbucket.org/username/my-new-project.git#master
$ npm install git+ssh://git@bitbucket.org/username/my-new-project.git#master
# Or, if you published as npm package:
$ npm install my-new-project --save-dev

2

W tym celu można użyć Verdaccio, który jest lekkim prywatnym rejestrem proxy npm wbudowanym w Node.js. Jest także darmowy i open source. Korzystanie z Verdaccio nie wymaga tyle kłopotów, co zwykły prywatny rejestr npm.

Możesz znaleźć szczegółowe informacje o tym, jak zainstalować i uruchomić go na swojej stronie internetowej, ale oto kroki:

To wymaga node >=8.x.

    // Install it from npm globally
    npm install -g verdaccio

    // Simply run with the default configuration that will host the registry which you can reach at http://localhost:4873/
    verdaccio

    // Set the registry for your project and every package will be downloaded from your private registry
    npm set registry http://localhost:4873/

    // OR use the registry upon individual package install
    npm install --registry http://localhost:4873

Ma również okno dokowane, dzięki czemu można łatwo opublikować go w publicznie dostępnym oknie dokowanym, a voila ma prywatne repozytorium npm, które można dystrybuować w sposób konfigurowany!


0

Bardzo prosta -

npm config set registry https://path-to-your-registry/

Właściwie ustawia registry = "https://path-to-your-registry"tę linię na/Users/<ur-machine-user-name>/.npmrc

Wszystkie wartości, które zostały ustawione jawnie lub zostały ustawione domyślnie, mogą być widoczne przez - npm config list

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.