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.