Czy istnieje sposób na skonfigurowanie wielu rejestrów w jednym pliku npmrc


143

Oto mój problem. Mamy prywatny rejestr NPM, który działa tylko w VPN. Chciałbym mieć rezerwowy rejestr https://registry.npmjs.org , aby po wyjściu z VPN działał bezproblemowo.

PS Obecnie używam npmrc, który dobrze radzi sobie z przełączaniem między plikami .npmrc jako obejściem


8
Właściwie chciałbym wiedzieć to samo. Może albo mój prywatny rejestr zostanie najpierw pingowany, a jeśli nie powiedzie się, powrót do rejestru publicznego (z lokalnego powrotu, a nie jednej konfiguracji na prywatnym serwerze). Lub alternatywnie przełączając mój rejestr na podstawie mojej nazwy Wi-Fi.
ProLoser

1
dla zagubionych dusz takich jak ja, przydatny dokument dla npmrc
Andreas

Odpowiedzi:


194

Można mieć wiele rejestrów dla scoped pakietów w swoim .npmrcpliku. Na przykład:

@polymer:registry=<url register A>
registry=http://localhost:4873/

Pakiety objęte @polymerzakresem będą otrzymywane z https://registry.npmjs.org , ale reszta zostanie odebrana od lokalnego NPM.


15
Dziękuję za tę radę. Czy możesz powiedzieć, czy można dodać uwierzytelnianie do tych rejestrów w określonym zakresie? Ponieważ potrzebuję klucza _auth do mojego głównego rejestru.
Bloomca

3
Co to jest pakiet o określonym zakresie? Nigdy o tym nie słyszałem.
jcollum

1
@jcollum, pakiety objęte zakresem to po prostu pakiety zgrupowane (lub objęte zakresem) za pośrednictwem przestrzeni nazw. Szczegółowe informacje można znaleźć pod adresem docs.npmjs.com/misc/scope . Scoping może być używany do powiązania kilku pakietów (takich jak @angular), co ułatwia ustalenie, że pakiet (@ angular / core) jest częścią Angular, ale może to być również firma taka jak @ mycompany / mypackage.
PatS

6
Czy jest to możliwe bez pakietów o określonym zakresie? powiedzmy, że jeśli szukamy tego konkretnego pakietu, przejdź do tego rejestru, w przeciwnym razie przejdź do tego rejestru
PinguinoSod

2
@PinguinoSod, Nie, nadal (od grudnia 2019 r.) Nie jest możliwe w przypadku pakietów bez zakresu. Sonatype to jedyne znane mi rozwiązanie. Zobacz stackoverflow.com/a/50995915/3281336
PatS,

71

W wersji 4.4.1, jeśli możesz zmienić nazwę pakietu, użyj:

npm config set @myco:registry http://reg.example.com

Gdzie @mycojest Twój zakres pakietu.

Możesz zainstalować pakiet w ten sposób:

npm install @myco/my-package

Więcej informacji: https://docs.npmjs.com/misc/scope


Wymagane jest również zainicjowanie pakietu z zakresem (npm init --scope = myco), a następnie opublikowanie go.
gjegadesh

1
Ok, ale jak mamy
rezerwę

1
Dostaję się, Invalid package name "@npmjs/": name can only contain URL-friendly characterskiedy biegamnpm i
umutesen

Mam też nazwa może zawierać tylko błędy przyjazne dla adresów URL
katwhocodes

To podejście wydaje mi się czystsze. Czy można to zrobić w pliku package.json?
Hari Krishna Gaddipati

19

Dla każdego, kto szuka również rozwiązania do uwierzytelniania, dodałbym rozwiązanie w zakresie pakietów, w którym można mieć wiele wierszy w .npmrcpliku:

//internal-npm.example.com:8080/:_authToken=xxxxxxxxxxxxxxx
//registry.npmjs.org/:_authToken=yyyyyyyyyy

Każda linia reprezentuje inny rejestr NPM


4
Użyłbym polecenia npm login --registry=npm.example.com. Będzie przechowywać dane logowania (authTokens) w pliku .npmrc w folderze użytkownika, więc nie musisz go mieć w kodzie źródłowym ( docs.npmjs.com/cli/adduser )
magikMaker

zadziałało dla mnie, dzięki, w zasadzie miałem prywatny rejestr Nexusa w mojej bibliotece, ale mój Lib ma kilka innych zależności, z których trzeba zainstalować registry.npmjs.org, to zadziałało dla mnie
Chanuka Asanka

17

Nie jest to najlepszy sposób, ale jeśli używasz Maca lub Linuksa nawet w systemie Windows, możesz ustawić alias dla różnych rejestrów.

##############NPM ALIASES######################
alias npm-default='npm config set registry https://registry.npmjs.org'
alias npm-sinopia='npm config set registry http://localhost:4873/'

2
Podobnym rozwiązaniem jest skonfigurowanie aliasu przekazującego opcję --registry do npm. Ma to ten sam efekt, ale tylko dla pojedynczego polecenia. Składnia toalias npm-sin=npm --registry https://localhost:4873/
PatS,

11

Ponieważ minęło już kilka lat i wydaje się, że nie jest to możliwe (używając samego npm), rozwiązaniem tego problemu jest użycie Nexus Repository Manager (firmy Sonatype). Nexus obsługuje wiele repozytoriów, umożliwia ich zamawianie, a także serwery proxy / pamięci podręczne w celu zwiększenia szybkości.

Istnieje darmowa wersja i wersja pro / płatna. Funkcję, która to obsługuje, opisano pod adresem : https://help.sonatype.com/repomanager3/node-packaged-modules-and-npm-registries

Odpowiednie informacje są zduplikowane poniżej, więc jeśli / kiedy powyższy adres URL / łącze przestanie działać, informacje nadal będą dostępne.

Grupa repozytoriów jest zalecanym sposobem ujawnienia wszystkich repozytoriów rejestrów npm z menedżera repozytoriów użytkownikom, bez konieczności dalszej konfiguracji po stronie klienta. Grupa repozytoriów umożliwia udostępnianie zagregowanej zawartości wielu repozytoriów proxy i hostowanych za pomocą jednego adresu URL do npm i innych narzędzi.

Pozwala tworzyć prywatne rejestry npm

Prywatny rejestr npm może służyć do przesyłania własnych pakietów, a także pakietów innych firm.

I

Aby ograniczyć zduplikowane pobieranie i zwiększyć prędkość pobierania dla programistów i serwerów CI, należy proxy rejestru hostowanego pod adresem https://registry.npmjs.org . Domyślnie npm uzyskuje bezpośredni dostęp do tego rejestru. Możesz również pośredniczyć w innych rejestrach, których potrzebujesz.

Oto krótka lista rzeczy, które musisz wykonać, aby to zadziałało:

  • Zainstaluj Nexusa

  • Utwórz lokalne / prywatne repozytorium (lub wskaż swoje prywatne repozytorium na innym serwerze)

  • Utwórz GRUPĘ zawierającą Twoje prywatne repozytorium i repozytorium publiczne.

  • Skonfiguruj swój plik $ HOME / .npmrc tak, aby wskazywał na właśnie utworzoną „GRUPĘ”.

  • Opublikuj swoje prywatne pakiety npm w lokalnym repozytorium.

  • Użytkownicy mogą teraz przeprowadzić jednorazową konfigurację.

npm config set registry https://nexus/content/groups/GROUP

  • Następnie użytkownicy mogą instalować zarówno pakiety publiczne, jak i prywatne za pośrednictwem npm install. npm install my-private-package npm install lodash any-other-public-package

Zarówno pakiety publiczne, jak i prywatne można zainstalować za pomocą prostego pliku npm install polecenia. Nexus znajduje pakiet przeszukując każde repozytorium skonfigurowane w grupie i zwraca wyniki. Więc npm nadal uważa, że ​​istnieje tylko jeden rejestr, ale za kurtyną jest używanych wiele repozytoriów.

WAŻNA UWAGA: Kiedy publikujesz komponenty, musisz określić npm publish --registry https://nexus/content/repositories/private-repo my-private-packagepolecenie, aby pakiet został opublikowany we właściwym repozytorium.


czy mogę skonfigurować zarówno rejestr (do wdrażania własnych artefaktów, jak i do ściągania publicznych artefaktów) w pliku .npmrc, aby nie musieć wspominać za każdym razem, gdy robię publikację npm? Do wypychania moich artefaktów używam oddzielnego repozytorium npm, a do ściągania wszystkich artefaktów używam repozytorium wirtualnego. Proszę, pomóż mi skonfigurować oba w pliku .npmrc.
Anshita Singh

1
@AnshitaSingh Właśnie przez to przeszedłem. Jeśli tak jak ja mam inne repozytorium do publikacji (np. npm-privateZamiast npm-group), możesz nadpisać registry-klucz w package.jsonswoim projekcie (zobacz https://blog.sonatype.com/using-nexus-3-as-your-repository-part-2-npm-packagesszczegóły). Używając npm config set registry <url>możesz ustawić np. npm-group, Który zawiera npm-registry(repozytorium przekazywania) i npm-private(własne repozytorium). Skorzystałem z tego rozwiązania, ponieważ usunięcie artefaktów z lokalnego GitLab CE było zbyt skomplikowane.
Igor

7

Możesz użyć składni wielu repozytoriów dla registrywpisu w swoim .npmrcpliku:

registry=http://serverA.url/repository-uri/
//serverB.url/repository-uri/
//serverC.url/repository-uri/:_authToken=00000000-0000-0000-0000-0000000000000
//registry.npmjs.org/

To spowodowałoby, że twój npm szukałby pakietów na różnych serwerach.


Tak, ale serverA, serverBi serverCprzykład repozytoria są z naszej sieci wewnętrznej, przyzwyczajenie praca dla Ciebie. Nie wiem, czy to jest dla ciebie odpowiednie, ale jeśli uważasz, że tak, możesz spróbować wdrożyć menedżera repozytorium Nexusa dla wewnętrznych repozytoriów.
Fernando Fernandes

1
zgodnie z tą odpowiedzią podwójny ukośnik nie ma znaczenia, więc po prostu ustawiasz klucze bez wartości
PinguinoSod

1
O ile mogłem zobaczyć z czytnika plików właściwości npm / ini, rzeczywiście // zostanie odczytany jako klucz bez wartości. Nawiasem mówiąc, podobnie jak sekcje o określonym zakresie, zostaną one zapisane jako pomocnicze serwery rejestru. Dostaną się do npm i będą przetwarzane jako serwery konfiguracyjne rejestru zgodnie z wewnętrznym algorytmem oceny npm.
Fernando Fernandes

1
Czy ktoś wypróbował to rozwiązanie. Czy to działa i pomaga skonfigurować repozytorium rezerwowe?
Luke P. Issac

3

Kilka kroków, które możesz spróbować. (tak robimy to w moim miejscu pracy)

  • Utwórz grupę rejestru z dwoma (lub więcej) adresami źródłowymi repozytorium. Jeden byłby Twoim wewnętrznym prywatnym, a drugi serwerem proxy dla npmjs dającym priorytet wewnętrznemu.
  • Ustaw tę grupę jako rejestr w pliku .npmrc. W ten sposób npm zawsze będzie próbował pobrać go z wewnętrznego, jeśli nie zostanie znaleziony, pobierz go z proxy

Mam nadzieję, że to pomoże.


6
Jak utworzyć grupę rejestru w npm? Co to znaczy?
Tuupertunut

1
@Tuupertunut register Najłatwiejszym sposobem byłoby użycie jakiegoś rodzaju menedżera repozytorium, takiego jak nexus typu sonatype. Może hostować prywatne rejestry, proxy w npmjs, a także tworzyć grupy repozytoriów.
Kaus Untwale



1

Od 13 kwietnia 2020 r. Nie ma takiej funkcjonalności, chyba że możesz korzystać z różnych zakresów, ale możesz użyć skryptu poinstalacyjnego jako obejścia. Jest to zawsze wykonywane, cóż , po każdej instalacji npm :

Powiedzmy, że masz plik .npmrc skonfigurowany do instalacji @ foo-org / foo-pack-private z prywatnego repozytorium github, ale publiczny pakiet @ foo-org / foo-pack-public znajduje się na npm (w tym samym zakresie: foo- org ).

Twoja postinstall może wyglądać tak:

"scripts": {
    ...
    "postinstall": "mv .npmrc .npmrcc && npm i @foo-org/foo-pack --dry-run && mv .npmrcc .npmrc".
}

Nie zapomnij usunąć @ foo-pack / foo-org z tablicy zależności, aby upewnić się, że npm install nie spróbuje pobrać go z github i dodać flagę --dry-run, która gwarantuje, że pakiet.json i pakiet- lock.json pozostaje niezmieniony po instalacji npm .


0

Moje podejście polegało na stworzeniu niewielkiego wariantu wiersza poleceń, który dodaje przełącznik rejestru.

Utworzyłem te pliki w folderze nodejs, w którym znajduje się plik wykonywalny npm:

npm-.cmd:

@ECHO OFF
npm --registry https://registry.npmjs.org %*

npm-:

#!/bin/sh
"npm" --registry https://registry.npmjs.org "$@"

Teraz, jeśli chcę wykonać operację na normalnym rejestrze npm (gdy nie jestem połączony z VPN), po prostu wpisuję npm-tam, gdzie zwykle piszę npm.

Aby przetestować to polecenie i wyświetlić rejestr pakietu, użyj tego przykładu:

npm- view lodash

PS. Jestem w systemie Windows i przetestowałem to w Bash, CMD i Powershell. ja również

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.