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
futlib
źródło

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
Mihai
źródło
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://[email protected]:myaccount/myprivate.git#v1.0.0",
    }
}
250R
źródło
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://[email protected]: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?

Pułkownik Panika
źródło
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:[email protected]/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.

arcseldon
źródło
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: [email protected]/user/repo.git zwraca EISDIR: nielegalna operacja na katalogu, przeczytaj . A „nazwa”: „git + użytkownik: [email protected]/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://[email protected]/orgname/repositoryname.git"

Na przykład:

npm install -S "git+https://[email protected]/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.

Ben Lesh
źródło
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"
}
bwest87
źródło
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.

dynamiclynk
źródło
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
roo2
źródło
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@[email protected]/myteamname/myprivate.git"

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

Kramer
źródło
2

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

dependencies: {
   "foo": "https://github.com/package/foo/tarball/master"
}
Alex Belozerov
źródło
2

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

npm install github:mygithubuser/myproject
Lars
źródło
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:[email protected]/username/my-new-project.git#master
$ npm install git+ssh://[email protected]/username/my-new-project.git#master

#  or from Bitbucket, public repo:
$ npm install git+ssh://[email protected]/username/my-new-project.git#master --save-dev
# Bitbucket, private repo:
$ npm install git+https://username:[email protected]/username/my-new-project.git#master
$ npm install git+ssh://[email protected]/username/my-new-project.git#master
# Or, if you published as npm package:
$ npm install my-new-project --save-dev
Izajasza
źródło
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!

Dominik
źródło
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

sapy
źródło