Czy istnieje sposób na zainstalowanie npm (polecenia) do pracy za proxy?


266

Przeczytaj o zmiennej proxy w .npmrcpliku, ale ona nie działa. Próbowanie uniknięcia ręcznego pobierania wszystkich wymaga pakietów i instalacji.

Odpowiedzi:


343

Rozwiązałem ten problem w ten sposób:

  1. Uruchomię to polecenie:

    npm config set strict-ssl false
  2. Następnie ustaw npm na działanie z http zamiast z https:

    npm config set registry "http://registry.npmjs.org/"
  3. Następnie instaluję pakiety przy użyciu tej składni:

    npm --proxy http://username:password@cacheaddress.com.br:80 install packagename

Pomiń username:passwordczęść, jeśli serwer proxy nie wymaga uwierzytelnienia

EDYCJA: Mój przyjaciel właśnie zauważył, że możesz zmusić NPM do pracy za proxy, ustawiając BOTH HTTP_PROXY i HTTPS_PROXY, a następnie wydając normalnie polecenie npm install express (na przykład)

EDIT2: Jak skomentował @BStruthers, pamiętaj, że hasła zawierające „@” nie zostaną poprawnie przeanalizowane, jeśli zawiera @, wpisz całe hasło w cudzysłowie


7
Heads up, jeśli twoje hasło zawiera „@” npm nie przeanalizuje poprawnie twojego ustawienia proxy. Potencjalnym obejściem jest umieszczenie fałszywej nazwy użytkownika: hasła w konfiguracji npm i użycie lokalnego serwera proxy (takiego jak skrzypek) do zmodyfikowania nagłówka autoryzacji serwera proxy żądania, aby mieć poprawną nazwę użytkownika: hasło. Należy pamiętać, że nazwa użytkownika: hasło przechowywane w Proxy-Authorization jest zakodowane w standardzie base64.
BStruthers

14
Jeśli twoje hasło zawiera symbol @, możesz je przekazać, umieszczając swoją nazwę użytkownika i hasło w cudzysłowie.
absynta myślący kowal sieciowy,

9
Hasło może zawierać znaki specjalne, ale muszą one być zakodowane w adresie URL. Więc jeśli twoje hasło było my@password, plik .npmrc powinien zawierać my%40passwordczęść hasła. Umieszczanie go w cudzysłowach działa w niektórych przypadkach, ale kodowanie jest niezawodne.
Chris Jaynes,

1
Kolejna gotcha! Jeśli masz już ustawione zmienne systemowe HTTP-PROXY, upewnij się, że je wyczyściłeś!
Sydwell

1
Ty legenda! Zrezygnowałem z próby nakłonienia npm do pracy w pracy, ale ostatecznie to rozwiązało.
tamj0rd2

308

Skonfiguruj npmserwer proxy

Dla HTTP:

npm config set proxy http://proxy_host:port

Dla HTTPS:

użyj adresu proxy https, jeśli taki istnieje

npm config set https-proxy https://proxy.company.com:8080

w przeciwnym razie ponownie użyj adresu proxy http

npm config set https-proxy http://proxy.company.com:8080

Uwaga : https-proxy nie ma httpsjako protokołu, ale http.


9
Brak obsługi SOCKS?
grm

57
Pamiętaj, że serwer proxy https nie ma protokołu „https”, ale „http”. Zmiana tego rozwiązała dla mnie problem.
peterhil

3
@peterhil Dzięki za tę wskazówkę. To szalone, ale spędziłem godziny, aby rozwiązać ten problem za pomocą „https”. Masz pojęcie, dlaczego tak to działa?
Manoj NV,

2
@ManojNV, połączenie z serwerem proxy nie jest szyfrowane. To nie jest rozmowa HTTPS z serwerem proxy, tylko HTTP. Ładunkiem jest SSL między klientem a serwerem docelowym. Gdyby to był HTTPS do serwera proxy, wówczas dane byłyby szyfrowane / odszyfrowywane dwukrotnie.
Jamie

1
Subtelny. Dziękuję bardzo @peterhil
Alec Breton

104

W razie wątpliwości wypróbuj wszystkie te polecenia, tak jak ja:

npm config set registry http://registry.npmjs.org/
npm config set proxy http://myusername:mypassword@proxy.us.somecompany:8080
npm config set https-proxy http://myusername:mypassword@proxy.us.somecompany:8080
npm config set strict-ssl false
set HTTPS_PROXY=http://myusername:mypassword@proxy.us.somecompany:8080
set HTTP_PROXY=http://myusername:mypassword@proxy.us.somecompany:8080
export HTTPS_PROXY=http://myusername:mypassword@proxy.us.somecompany:8080
export HTTP_PROXY=http://myusername:mypassword@proxy.us.somecompany:8080
export http_proxy=http://myusername:mypassword@proxy.us.somecompany:8080

npm --proxy http://myusername:mypassword@proxy.us.somecompany:8080 \
--without-ssl --insecure -g install

=======

AKTUALIZACJA

Umieść swoje ustawienia do ~/.bashrcalbo ~/.bash_profilewięc nie trzeba się martwić o ustawienia za każdym otwarciu nowego okna terminala!

Jeśli twoja firma jest podobna do mojej, muszę dość często zmieniać hasło. Dodałem więc do mojego ~ / .bashrc lub ~ / .bash_profile, aby za każdym razem, gdy otwieram terminal, wiedziałem, że mój npm jest aktualny!

  1. Po prostu wklej następujący kod na dole ~/.bashrcpliku:

    ######################
    # User Variables (Edit These!)
    ######################
    username="myusername"
    password="mypassword"
    proxy="mycompany:8080"
    
    ######################
    # Environement Variables
    # (npm does use these variables, and they are vital to lots of applications)
    ######################
    export HTTPS_PROXY="http://$username:$password@$proxy"
    export HTTP_PROXY="http://$username:$password@$proxy"
    export http_proxy="http://$username:$password@$proxy"
    export https_proxy="http://$username:$password@$proxy"
    export all_proxy="http://$username:$password@$proxy"
    export ftp_proxy="http://$username:$password@$proxy"
    export dns_proxy="http://$username:$password@$proxy"
    export rsync_proxy="http://$username:$password@$proxy"
    export no_proxy="127.0.0.10/8, localhost, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16"
    
    ######################
    # npm Settings
    ######################
    npm config set registry http://registry.npmjs.org/
    npm config set proxy "http://$username:$password@$proxy"
    npm config set https-proxy "http://$username:$password@$proxy"
    npm config set strict-ssl false
    echo "registry=http://registry.npmjs.org/" > ~/.npmrc
    echo "proxy=http://$username:$password@$proxy" >> ~/.npmrc
    echo "strict-ssl=false" >> ~/.npmrc
    echo "http-proxy=http://$username:$password@$proxy" >> ~/.npmrc
    echo "http_proxy=http://$username:$password@$proxy" >> ~/.npmrc
    echo "https_proxy=http://$username:$password@$proxy" >> ~/.npmrc
    echo "https-proxy=http://$username:$password@$proxy" >> ~/.npmrc
    
    ######################
    # WGET SETTINGS
    # (Bonus Settings! Not required for npm to work, but needed for lots of other programs)
    ######################
    echo "https_proxy = http://$username:$password@$proxy/" > ~/.wgetrc
    echo "http_proxy = http://$username:$password@$proxy/" >> ~/.wgetrc
    echo "ftp_proxy = http://$username:$password@$proxy/" >> ~/.wgetrc
    echo "use_proxy = on" >> ~/.wgetrc
    
    ######################
    # CURL SETTINGS
    # (Bonus Settings! Not required for npm to work, but needed for lots of other programs)
    ######################
    echo "proxy=http://$username:$password@$proxy" > ~/.curlrc
  2. Następnie edytuj pola „nazwa użytkownika”, „hasło” i „proxy” w wklejonym kodzie.

  3. Otwórz nowy terminal

  4. Sprawdź ustawienia, uruchamiając npm config listicat ~/.npmrc

  5. Spróbuj zainstalować moduł za pomocą

    • npm install __lub
    • npm --without-ssl --insecure install __lub
    • zastąp ustawienia serwera proxy za pomocą npm --without-ssl --insecure --proxy http://username:password@proxy:8080 install __.
    • Jeśli chcesz, aby moduł był dostępny globalnie, dodaj opcję -g

3
Ostatnie polecenie działało dla mnie. Wszystkie poprzednie zawiodły
foecum

3
przeczytałem około 50 odpowiedzi dotyczących tej cholernej konfiguracji proxy ... jedyna, która zadziałała, była twoją odpowiedzią ... dziękuję !!!
Lorenzo

4
Dzięki chłopaki!! Cieszę się, że działa! To był ogromny ból głowy w pracy, więc cieszę się, że mogę pomóc innym: P
Katie

2
+1. To działa. Kiedyś commands- npm config set registry http://registry.npmjs.org/, npm config set proxy http://myusername:mypassword@proxy.us.somecompany:8080, npm config set https-proxy http://myusername:mypassword@proxy.us.somecompany:8080, npm config set strict-ssl falsedla npm config, a następnie zainstalować pakiet npm użyciem npm --proxy http://myusername:mypassword@proxy.us.somecompany:8080 --without-ssl --insecure -g install {packagename}. Dzięki
Atur

1
Po trzech dniach próbowania to rozwiązanie zadziałało dla mnie.
Mohan Singh

33

Czy wypróbowałeś opcje wiersza polecenia zamiast .npmrcpliku?

Myślę, że coś npm --proxy http://proxy-server:8080/ install {package-name}dla mnie zadziałało.

Widziałem także: npm config set proxy http://proxy-server:8080/


+1 próbowałem innych, to był ten, który pracował dla mnie. z udziałem
autora

20

Chociaż istnieje już wiele dobrych rad, dla mojego środowiska (Windows 7, przy użyciu PowerShell) i ostatniej dostępnej wersji node.js (v8.1.2) wszystkie powyższe nie działały, z wyjątkiem sytuacji, gdy przestrzegałem ustawień brunowego .

Sprawdź więc swoje ustawienia za pomocą:

npm config list

Ustawienia za proxy:

npm config set registry http://registry.npmjs.org/
npm config set http-proxy http://username:password@ip:port
npm config set https-proxy http://username:password@ip:port
npm config set proxy http://username:password@ip:port
npm set strict-ssl false

Mam nadzieję, że pozwoli to komuś zaoszczędzić czas


jak mogę znaleźć mój adres proxy?
Robin

@Robin Jeden sposób, jeśli używasz systemu Windows, IE je przechowuje. Możesz przejść pod IE i wyświetlić ustawienia sieci LAN pod połączeniem, a tam to pokaże.
eaglei22,

@Robin oczywiście zależy od przeglądarki, ale zwykle jest w ustawieniach
Carmine Tambascia

@ Robin w przeglądarkach w ustawieniach powinieneś zobaczyć / sprawdzić ustawienie proxy. Zwykle jest plik z rozszerzeniem .pac, gdzie ostatnia powinna być: PROXY YourProxyAdress: PORT
Carmine Tambascia

17

Działa to dla mnie w systemie Windows:

npm config set proxy http://domain%5Cuser:pass@host:port

Jeśli nie jesteś w żadnej domenie, użyj:

npm config set proxy http://user:pass@host:port

Jeśli hasło zawiera znaki specjalne, takie jak ", @, :i tak dalej, zastąpić je przez ich URL zakodowane wartości. Na przykład "-> %22, @-> %40, :-> %3A. %5Cjest używany dla postaci \.


6
Dzięki za radę, to zadziałało dla mnie. Możesz otworzyć konsolę javascript za pomocą klawiszy Ctrl + Shift + J i wpisać, encodeURIComponent("YourP@ssword")aby uzyskać zakodowaną wersję hasła.
jaggedsoft

15

Aby skonfigurować serwer proxy HTTP, należy ustawić flagę -g :

sudo npm config set proxy http://proxy_host:port -g

W przypadku serwera proxy https ponownie upewnij się, że ustawiona jest opcja -g :

sudo npm config set https-proxy http://proxy_host:port -g


jakie jest znaczenie -g?
David,

1
konfiguruje go globalnie, nie dla instalacji lokalnej
Andrei

8
$ npm config set proxy http://login:pass@host:port
$ npm config set https-proxy http://login:pass@host:port

1
Dodaj proszę komentarze.
Max

8

To zadziałało dla mnie

npm config set proxy http://proxy.company.com:8080
npm config set https-proxy http://proxy.company.com:8080
npm set strict-ssl=false

7

vim ~/.npmrcna komputerze z systemem Linux i dodaj następujące. Nie zapomnij dodać registryczęści, ponieważ w wielu przypadkach powoduje to awarię.

proxy=http://<proxy-url>:<port>
https-proxy=https://<proxy-url>:<port>
registry=http://registry.npmjs.org/

2
Wiele serwerów proxy obsługuje tunelowanie żądań https, ale nie obsłuży połączenia z samym sobą. Jako taki, gdy napotkasz problemy, spróbuj zmienić https-proxy=https://..nahttps-proxy=http://..
YoYo

7

W końcu udało mi się rozwiązać ten problem, będąc proxy z uwierzytelnianiem AD. Musiałem wykonać:

npm config set proxy http://domain%5Cuser:password@proxy:port/
npm config set https-proxy http://domain%5Cuser:password@proxy:port/

Bardzo ważne jest, aby kodować URL dowolnymi specjalnymi znakami, takimi jak backshlash lub # W moim przypadku musiałem kodować

  1. backshlashz% 5C, więc domain\user willbądźdomain%5Cuser
  2. #zaloguj się %23%0Atak jak hasło Password#2będziePassword%23%0A2

Dodałem również następujące ustawienia:

npm config set strict-ssl false
npm config set registry http://registry.npmjs.org/


6

Próbowałem wszystkich tych opcji, ale z jakiegoś powodu mój serwer proxy nie miał żadnej z nich. Potem, urodzony z rozpaczy / rozpaczy, losowo spróbowałem curlw mojej skorupie Git Bash i zadziałało.

Wyłączenie wszystkich opcji proxy za pomocą

npm config rm proxy
npm config rm https-proxy

A potem uruchomienie npm installmojej powłoki Git Bash działało idealnie. Nie wiem, jak to jest poprawnie skonfigurowane dla proxy, a cmdmonit Windows nie jest, ale działał.


6
npm config set proxy <http://...>:<port_number>
npm config set registry http://registry.npmjs.org/

To rozwiązało mój problem.


Najważniejszą rzeczą była zmiana linku do rejestru: zamiast https miałem wcześniej link http.
Alex Fainshtein

6

Po ostatecznym powiązaniu różnych odpowiedzi pierwsze cztery wiersze odpowiedzi @Kayvar pomagają mi rozwiązać problem:

npm config set registry http://registry.npmjs.org/
npm config set proxy http://myusername:mypassword@proxy.us.somecompany:8080
npm config set https-proxy http://myusername:mypassword@proxy.us.somecompany:8080
npm config set strict-ssl false


5

Spróbuj znaleźć plik .npmrc w folderze C: \ Users \ .npmrc

następnie otwórz (notatnik), napisz i zapisz w środku:

proxy=http://<username>:<pass>@<proxyhost>:<port>

PS: proszę usunąć „<” i „>” !!


5

Dla mnie, mimo że python itp. Wszystko będzie działać, chociaż nasz korporacyjny serwer proxy npm nie.

próbowałem

npm config set proxy http://proxyccc.xxx.ca:8080 npm config set https-proxy https://proxyccc.xxx.ca:8080 npm config set registry http://registry.npmjs.org/

zgodnie z instrukcją, ale ciągle pojawia się ten sam błąd.

Dopiero gdy usunąłem https-proxy https://proxyccc.xxx.ca:8080 z pliku .npmrc, npm zainstalował elektron - zadziałało save-dev


1
Twój https-proxyprawdopodobnie nie jest https:. Przynajmniej posiadanie tego samego portu dla każdego prawdopodobnie nie jest poprawne, ale myślę, że oba mają prawdopodobnie tę samą wartość.
toddkaufmann

5

W systemie Windows

Spróbuj usunąć ustawienia proxy i rejestru (jeśli są już ustawione) i ustaw zmienne środowiskowe w wierszu poleceń za pośrednictwem

SET HTTP_PROXY=http://username:password@domain:port
SET HTTPS_PROXY=http://username:password@domain:port

następnie spróbuj uruchomić npm install. Dzięki temu nie ustawisz proxy w .npmrc, ale dla tej sesji będzie działać.


To zadziałało dla mnie. Symbol równości wydaje się sprawiać, że wszystko działa. Wcześniej po prostu używałem, SET HTTP_PROXY http://username:password@domain:portale przełączanie na SET HTTP_PROXY=http://username:password@domain:portwydawało się, że wszystko działa
Dib

4

Użyj poniższego polecenia w cmd lub GIT Bash lub w innym wierszu poleceń

$ Npm config zestaw proxy " http://192.168.1.101:4128 "

Zestaw konfiguracyjny npm $ https-proxy " http://192.168.1.101:4128 "

gdzie 192.168.1.101 to proxy ip, a 4128 to port. zmień zgodnie z ustawieniami serwera proxy. to działa dla mnie.


1
Muszę użyć domeny do uwierzytelnienia i użyłem znaku ukośnika odwrotnego: z tym łańcuchem% 5C. W końcu udało się!
Francesco

4

Wiele aplikacji (np. Npm) może korzystać z ustawień proxy ze zmiennych środowiskowych użytkownika.

Możesz po prostu dodać do swojego środowiska następujące zmienne HTTP_PROXY i HTTPS_PROXY, które będą miały tę samą wartość dla każdego

http: // użytkownik: hasło @ proxy Adres: proxyPort

Na przykład jeśli masz system Windows, możesz dodać serwer proxy w następujący sposób:

Jak to wygląda w systemie Windows


4

W moim przypadku zapomniałem ustawić „http: //” w moich plikach konfiguracyjnych (można je znaleźć w C: \ Users \ [USERNAME] \ .npmrc) adresy proxy. Więc zamiast mieć

proxy=http://[IPADDRESS]:[PORTNUMBER]
https-proxy=http://[IPADDRESS]:[PORTNUMBER]

miałem

proxy=[IPADDRESS]:[PORTNUMBER]
https-proxy=[IPADDRESS]:[PORTNUMBER]

Co oczywiście nie działało, ale komunikaty o błędach również niewiele pomogły ...


4

Na powyższe pytanie było wiele odpowiedzi, ale żadna z nich nie działała dla mnie. Wszystkie wymienione, aby dodać http://prefiks. Więc też to dodałem. Wszystko zawiodło.

W końcu działa, gdy przypadkowo usunąłem http://prefiks. Ostateczna konfiguracja wygląda następująco:

npm config set registry http://registry.npmjs.org/
npm config set http-proxy ip:port
npm config set https-proxy ip:port
npm config set proxy ip:port
npm set strict-ssl false

Nie znam logiki tego, ale zadziałało. Jeśli żadna z powyższych odpowiedzi nie działa dla Ciebie, być może możesz spróbować w ten sposób. Mam nadzieję, że to się przyda.


4

Na stronie curl znajdują się dobre informacje na temat problemów z SSL i certyfikatami . Większość odpowiedzi opieram na zawartych tam informacjach.

Używanie false-ssl false jest złą praktyką i może powodować problemy. Zamiast tego możemy dodać certyfikat, który jest wstrzykiwany przez certyfikat „człowiek w środku”.

Jak rozwiązać ten problem w systemie Windows:

  1. Pobierz certyfikaty CA z curl na podstawie pakietu CA Mozilli. Możesz także użyć skryptu shelll „firefox-db2pem.sh” curl do konwersji lokalnej bazy danych Firefox.
  2. Przejdź do strony internetowej przy użyciu protokołu https, na przykład Stackoverflow w Chrome lub Internet Explorer
  3. Kliknij ikonę kłódki, kliknij Wyświetl certyfikaty lub „Ważny” w Chrome
  4. Przejdź do ścieżki certyfikacji. Najwyższy certyfikat lub certyfikat główny to ten, który chcemy wyodrębnić. Kliknij ten certyfikat, a następnie „wyświetl certyfikat”
  5. Kliknij drugą kartę „Szczegóły”. Kliknij „Kopiuj do pliku”. Wybierz format DER i zanotuj miejsce zapisania pliku. Wybierz odpowiednią nazwę pliku, na przykład rootcert.cer
  6. Jeśli masz zainstalowany Git, będziesz mieć openssl.exe. W przeciwnym razie zainstaluj git dla Windows na tym etapie. Najprawdopodobniej plik wykonywalny openssl będzie w C: \ Program Files \ git \ usr \ bin \ openssl.exe. Użyjemy openssl do konwersji pliku do formatu PEM, którego potrzebujemy, aby NPM mógł go zrozumieć.
  7. Konwertuj plik zapisany w kroku 5 za pomocą tego polecenia:
    openssl x509 -inform DES -in **rootcert**.cer -out outcert.pem -text
    gdzie rootcert to nazwa pliku certyfikatu zapisanego w kroku 5.
  8. Otwórz plik outcert.pem w edytorze tekstu wystarczająco inteligentnym, aby zrozumieć zakończenia linii, więc nie notatnik. Zaznacz cały tekst i skopiuj go do schowka.
  9. Teraz wkleimy tę treść na końcu pakietu CA Cert wykonanego w kroku 1. Więc otwórz cacert.pem w swoim zaawansowanym edytorze tekstów . Przejdź na koniec pliku i wklej zawartość z poprzedniego kroku do końca pliku. (Zachowaj pustą linię poniżej tego, co właśnie wkleiłeś)
  10. Skopiuj zapisany plik cabundle.pem w odpowiednie miejsce. Np. Twój% userprofile% lub ~. Zanotuj lokalizację pliku.
  11. Teraz powiemy npm / przędzy, aby korzystały z nowego pakietu. W wierszu polecenia wpisz,
    npm config set cafile **C:\Users\username\cacert.pem
    gdzie C: \ Users \ nazwa użytkownika \ cacert.pem jest ścieżką z kroku 10.
  12. Opcjonalnie: ponownie włącz strict-ssl, npm config set strict-ssl true

Uff! Zrobiliśmy to! Teraz npm może zrozumieć, jak się połączyć. Premia polega na tym, że możesz powiedzieć curlowi, aby używał tego samego cabundle.pem, a także zrozumie HTTPs.


3

Oto kroki, które wykonałem (Windows):

  1. Edytuj następujący plik C:\Users\<WIN_USERNAME>\.npmrc
  2. Wyeksportuj certyfikat do swojego systemu plików z następującego adresu: https://registry.npmjs.org

  3. Przejdź do lokalizacji wyeksportowanego certyfikatu i wydaj następujące polecenie:

    npm config set cafile npm_certificate.cer

  4. Dodaj następujące zmiany do pliku: registry=https://registry.npmjs.org/ strict-ssl=false https-proxy=http://[proxy_user]:[proxy_password]@[proxy_ip]:[proxy_port]/ cafile=npm_certificate.cer

Teraz powinieneś być gotowy do pracy!


2

Moja sprawa sprowadza się do głupiego błędu z mojej strony. Ponieważ pewnego dnia szybko upuściłem swoje serwery proxy do pliku Windows * .bat (http_proxy, https_proxy i ftp_proxy), zapomniałem uciec od znaków specjalnych dla domeny \ użytkownika zakodowanej w adresie URL (% 5C) i hasła ze znakiem zapytania „?” (% 3F). Innymi słowy, kiedy masz zakodowane polecenie, nie zapomnij uciec od „%” w poleceniu pliku bat.

Zmieniłam

set http_proxy=http://domain%5Cuser:password%3F@myproxy:8080

do

set http_proxy=http://domain%%5Cuser:password%%3F@myproxy:8080

Może to przypadek na marginesie, ale mam nadzieję, że komuś pomoże.


1

kiedy podaję bez prefiksu http / http w ustawieniach proxy npm nie powiodło się, nawet jeśli host i port proxy miały prawidłowe wartości. Działało to dopiero po dodaniu prefiksu protokołu.


0

Po prostu otwórz nowy terminal i wpisz npm config editi npm config -g edit. Przywróć domyślne. Po tym zamkniętym terminalu otwórz nowy i wpisz, npm --without-ssl --insecure --proxy http://username:password@proxy:8080 install <package>jeśli potrzebujesz globalnie, po prostu dodaj -g.

To zadziałało dla mnie, mam nadzieję, że zadziała dla ciebie :)

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.