有没有办法让npm install(命令)在代理后面工作?

时间:2011-09-26 18:37:17

标签: node.js npm

了解.npmrc文件中的代理变量但不起作用。尽量避免手动下载所有需要包和安装。

30 个答案:

答案 0 :(得分:298)

我用这种方式解决了这个问题:

  1. 我运行此命令:

    npm config set strict-ssl false
    
  2. 然后将npm设置为使用http而不是https:

    运行
    npm config set registry "http://registry.npmjs.org/"
    
  3. 然后我使用以下语法安装软件包:

    npm --proxy http://username:password@cacheaddress.com.br:80 install packagename
    
  4. 如果代理不需要您进行身份验证,请跳过username:password部分

    编辑:我的一位朋友刚刚指出,你可以通过设置 BOTH HTTP_PROXY和HTTPS_PROXY环境变量让NPM在代理后面工作,然后正常发出命令 npm install express (例如)

    EDIT2:正如@BStruthers评论的那样,请记住,如果包含@将整个密码放在引号中,那么包含“@”的密码将无法正确解析

答案 1 :(得分:265)

设置npm代理

HTTP

npm config set proxy http://proxy_host:port

HTTPS

如果有一个

,请使用https代理地址
npm config set https-proxy https://proxy.company.com:8080

否则重用http代理地址

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

注意:https-proxy没有https作为协议,但是http

答案 2 :(得分:94)

如果有疑问,请像我一样尝试所有这些命令:

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

=======

更新

将您的设置放入~/.bashrc~/.bash_profile,这样您每次打开新的终端窗口时都不必担心自己的设置!

如果您的公司与我的公司一样,我必须经常更改密码。所以我将以下内容添加到〜/ .bashrc或〜/ .bash_profile中,以便每当我打开终端时,我都知道我的npm是最新的!

  1. 只需将以下代码粘贴到~/.bashrc文件的底部:

    即可
    ######################
    # 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. 然后编辑您粘贴的代码中的“用户名”,“密码”和“代理”字段。

  3. 打开一个新终端

  4. 运行npm config listcat ~/.npmrc

  5. 检查您的设置
  6. 尝试使用

    安装模块
    • npm install __
    • npm --without-ssl --insecure install __
    • 使用npm --without-ssl --insecure --proxy http://username:password@proxy:8080 install __覆盖您的代理设置。
    • 如果您希望模块全局可用,请添加选项-g

答案 3 :(得分:30)

您是否尝试过命令行选项而不是.npmrc文件?

我觉得npm --proxy http://proxy-server:8080/ install {package-name}之类的东西对我有用。

我也看到了以下内容: npm config set proxy http://proxy-server:8080/

答案 4 :(得分:20)

虽然已经有很多好的建议,但对于我的环境(Windows 7,使用PowerShell)和node.js(v8.1.2)的最新版本,以上所有都没有用,除非我遵循{{3} }设置。

请使用以下方法检查您的设置:

npm config list

代理背后的设置:

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

希望这会节省时间给某人

答案 5 :(得分:15)

要设置http代理,请设置 -g 标志:

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

对于https代理,请再次确保设置 -g 标志:

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

答案 6 :(得分:14)

这适用于Windows:

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

如果您不在任何域中,请使用:

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

如果您的密码包含"@:等特殊字符,请使用其网址编码值替换它们。例如" - > %22@ - > %40: - > %3A%5C用于角色\

答案 7 :(得分:8)

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

答案 8 :(得分:7)

这对我有用 -

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

答案 9 :(得分:6)

我尝试了所有这些选项,但我的代理由于某种原因没有任何选项。然后,出于绝望/绝望,我在我的Git Bash shell中随机尝试了curl,它起作用了。

使用

取消设置所有代理选项
npm config rm proxy
npm config rm https-proxy

然后在我的Git Bash shell中运行npm install工作得很好。我不知道它是如何为代理正确设置的,而Windows cmd提示符不是,但它有效。

答案 10 :(得分:6)

在您的Linux机器中

vim ~/.npmrc并添加以下内容。在许多情况下,不要忘记添加registry部分,因为这会导致失败。

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

答案 11 :(得分:6)

虽然我用config设置代理,问题没有解决,但之后 这个对我有用:

  

npm --https-proxy http://XX.AA.AA.BB:8080安装cordova-plugins

     

npm --proxy http://XX.AA.AA.BB:8080安装

答案 12 :(得分:5)

mgmt-users.properties

这解决了我的问题。

答案 13 :(得分:5)

这对我有用。 设置http和https代理。

答案 14 :(得分:5)

尝试在C:\ Users \ .npmrc

中找到.npmrc

然后打开(记事本),写入并保存在内部:

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

PS:删除“&lt;”和“&gt;”拜托!

答案 15 :(得分:4)

最终结束不同的答案后,@ Kayvar回答了前四行帮我解决问题:

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

答案 16 :(得分:4)

最后,我设法解决了使用AD身份验证作为代理的问题。我必须执行:

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

URL编码任何特殊字符(如反斜杠或#)非常重要 就我而言,我必须编码

  1. backshlash和%5C,因此domain\user willdomain%5Cuser
  2. #%23%0A签名,因此像Password#2这样的密码将是Password%23%0A2

我还添加了以下设置:

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

答案 17 :(得分:4)

对我而言,尽管我们的公司代理npm不会,但python等都能正常工作。

我试过

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/

按照指示

但仍然遇到同样的错误。

只有当我删除时才会这样 https-proxy https://proxyccc.xxx.ca:8080 来自.npmrc文件 那 npm install electron --save-dev working

答案 18 :(得分:4)

在cmd或GIT Bash或其他提示下使用以下命令

$ npm config set proxy&#34; http://192.168.1.101:4128&#34;

$ npm config set https-proxy&#34; http://192.168.1.101:4128&#34;

其中192.168.1.101是代理IP,4128是端口。根据您的代理设置进行更改。它适用于我。

答案 19 :(得分:3)

在Windows系统上

尝试删除代理和注册表设置(如果已设置)并通过

在命令行上设置环境变量
SET HTTP_PROXY=http://username:password@domain:port
SET HTTPS_PROXY=http://username:password@domain:port

然后尝试运行npm install。这样,您就不会在.npmrc中设置代理,但对于该会话,它将起作用。

答案 20 :(得分:2)

许多应用程序(例如npm)可以使用来自用户环境变量的代理设置。

您可以按照 HTTP_PROXY HTTPS_PROXY 变量添加到您的环境中,每个变量具有相同的值

http://user:password@proxyAddress:proxyPort

例如,如果您有Windows,则可以按如下方式添加代理:

How it looks on Windows

答案 21 :(得分:2)

在我的情况下,我忘了设置&#34; http://&#34;在我的配置文件中(可以在C:\ Users \ [USERNAME] \ .npmrc中找到)代理地址。所以没有

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

我有

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

当然哪个不起作用,但错误信息也没有多大帮助......

答案 22 :(得分:2)

上面有很多关于这个问题的答案,但没有一个对我有用。所有这些都提到添加http://前缀。所以我也添加了它。都失败了。

在我意外删除http://前缀后,它终于有效了。最终配置是这样的:

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

我不知道这背后的逻辑,但它奏效了。如果上述答案都不适合您,也许您可​​以尝试这种方式。希望这个有用。

答案 23 :(得分:1)

以下是我遵循的步骤(Windows):

  1. 编辑以下文件C:\Users\<WIN_USERNAME>\.npmrc
  2. 从以下地址将证书导出到文件系统:https://registry.npmjs.org

  3. 导航到导出的证书位置并发出以下命令:

    npm config set cafile npm_certificate.cer

  4. 将以下更改添加到文件: registry=https://registry.npmjs.org/ strict-ssl=false https-proxy=http://[proxy_user]:[proxy_password]@[proxy_ip]:[proxy_port]/ cafile=npm_certificate.cer

现在您应该准备好了!

答案 24 :(得分:1)

我的问题归结为我的一个愚蠢的错误。因为我有一天很快将我的代理放入windows * .bat文件(http_proxy,https_proxy和ftp_proxy),我忘了逃避url编码的域\用户(%5C)的特殊字符和带有问号的密码'?' (%3F)。也就是说,一旦你有编码命令,不要忘记在bat文件命令中转义'%'。

我改变了

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

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

也许这是一个边缘案例,但希望它有助于某人。

答案 25 :(得分:1)

SSL and certificate issues上有关于curl页面的详细信息。 我的大部分答案都是基于那里的信息。

使用strict-ssl false是不好的做法,可能会产生问题。我们可以做的是添加正在注入的证书,由中间的&#34; man&#34;证书。

如何在Windows上解决此问题:

  1. 根据Mozilla的CA捆绑包从curl下载CA证书。你也可以使用curl&#34; firefox-db2pem.sh&#34;用于转换本地Firefox数据库的shellscript。
  2. 使用https转到网页,例如Chrome或Internet Explorer中的Stackoverflow
  3. 点击锁定图标,点击查看证书或&#34;有效&#34;在Chrome中
  4. 导航到证书路径。顶级证书或根证书是我们要提取的证书。单击该证书,然后&#34;查看证书&#34;
  5. 点击第二个标签,&#34;详情&#34;。单击&#34;复制到文件&#34;。选择DER格式并记下保存文件的位置。选择合适的文件名,例如rootcert.cer
  6. 如果你安装了Git,你将拥有openssl.exe。否则,在此阶段安装git for windows。很可能openssl可执行文件位于C:\ Program Files \ git \ usr \ bin \ openssl.exe。我们将使用openssl将文件转换为NPM理解它所需的PEM格式。
  7. 使用此命令转换在步骤5中保存的文件:
    openssl x509 -inform DES -in **rootcert**.cer -out outcert.pem -text
    其中 rootcert 是您在步骤5中保存的证书的文件名。
  8. 在文本编辑器中打开outcert.pem足够智能,以了解行尾,所以不要记事本。选择所有文本并将其复制到剪贴板。
  9. 现在,我们将该内容粘贴到步骤1中制作的CA Cert捆绑包的末尾。因此,请在高级短信服务器中打开 cacert.pem 。转到文件末尾,将上一步中的内容粘贴到文件末尾。 (保留刚刚粘贴的空白行)
  10. 将保存的cabundle.pem复制到合适的位置。例如你的%userprofile%或〜。记下文件的位置。
  11. 现在我们将告诉npm / yarn使用新捆绑包。在命令行中,写入 npm config set cafile **C:\Users\username\cacert.pem
    其中 C:\ Users \ username \ cacert.pem 是步骤10中的路径。
  12. 可选:再次启用strict-ssl,npm config set strict-ssl true
  13. 唷!我们做到了!现在npm可以理解如何连接。奖金是你可以告诉curl使用相同的cabundle.pem,它也会理解HTTP。

答案 26 :(得分:1)

当我在代理设置中没有http / http前缀时,即使代理主机和端口是正确的值,npm也会失败。它只在添加协议前缀后才起作用。

答案 27 :(得分:0)

只需打开新终端并输入npm config editnpm config -g edit。重置为默认值。在关闭的终端之后,打开新终端并输入npm --without-ssl --insecure --proxy http://username:password@proxy:8080 install <package>(如果需要全局),只需添加-g

它对我有用,希望对你有用:)

答案 28 :(得分:0)

转到环境变量,然后将其删除或将其设置为空

HTTP_PROXY和HTTPS_PROXY

它也将解决企业环境的代理问题

答案 29 :(得分:0)

我只是在 npm 和代理设置方面有过挣扎,因为我不喜欢其他答案,所以我想分享我认为应该如何解决这个问题(不能妥协安全性)。

文档说明

首先,您必须了解与代理相关的 npm 有哪些重要设置:

  • proxy 用于传出 http 请求的代理。如果设置了 HTTP_PROXY 或 http_proxy 环境变量,则底层请求库将遵循代理设置。
  • https-proxy 用于传出 https 请求的代理。如果设置了 HTTPS_PROXY 或 https_proxy 或 HTTP_PROXY 或 http_proxy 环境变量,则底层请求库将遵循代理设置。
  • noproxy 不应该使用代理的逗号分隔字符串或域扩展数组。
  • cafile 包含一个或多个证书颁发机构签名证书的文件的路径。类似于 ca 设置,但允许多个 CA,以及将 CA 信息存储在磁盘上的文件中。

现在,由于 proxyhttps-proxy 的默认值基于环境变量,因此建议您正确配置这些变量,以便其他工具也能正常工作(例如 curl)。

请注意,对于 v6,noproxy 文档没有说明任何关于环境变量的内容,而是提到了 since v7 NO_PROXY 环境变量。我的环境 未配置为验证此变量的工作方式(如果涵盖小写版本)。

正确配置

现在我正在配置应该在代理后面使用的 docker 镜像,并且在 Dockerfile 中需要这些条目:

COPY certs/PoroxyCertificate.crt /usr/local/share/ca-certificates/
COPY certs/RootCa.crt /usr/local/share/ca-certificates/
RUN update-ca-certificates
# here all tools like curl were working

RUN  ["/bin/bash", "-c", "set -o pipefail && curl -sSL https://deb.nodesource.com/setup_14.x  |  bash -"]
RUN apt-get -y update && apt-get install -y nodejs
RUN npm config set cafile /etc/ssl/certs/ca-certificates.crt -g

现在有趣的是我需要两个证书文件。 RootCa.crt 是所有公司服务器的自签名证书,PoroxyCertificate.crt 包含该证书,但它还有一个额外的中间 SubCA 证书。代理响应长度为 3 的证书链。

现在 update-ca-certificates 会扫描目录 /usr/local/share/ca-certificates/ 以获取新证书并更新 /etc/ssl/certs/ca-certificates.crt,其中包含的内容远多于那些自定义证书。

将此 /etc/ssl/certs/ca-certificates.crt 提供给 cafile of npm config 可解决使用代理时证书的所有问题。

重要提示

npm v6 证书错误经常导致 npm ERR! Maximum call stack size exceeded 非常混乱(我什至故意破坏证书来验证这个问题),日志文件包含如下内容:

RangeError: Maximum call stack size exceeded
    at isDepOptional (/usr/lib/node_modules/npm/lib/install/deps.js:417:24)
    at failedDependency (/usr/lib/node_modules/npm/lib/install/deps.js:441:9)
    at failedDependency (/usr/lib/node_modules/npm/lib/install/deps.js:457:9)
    at failedDependency (/usr/lib/node_modules/npm/lib/install/deps.js:457:9)
    at failedDependency (/usr/lib/node_modules/npm/lib/install/deps.js:457:9)
    at failedDependency (/usr/lib/node_modules/npm/lib/install/deps.js:457:9)
    at failedDependency (/usr/lib/node_modules/npm/lib/install/deps.js:457:9)
    at failedDependency (/usr/lib/node_modules/npm/lib/install/deps.js:457:9)
    at failedDependency (/usr/lib/node_modules/npm/lib/install/deps.js:457:9)
    at failedDependency (/usr/lib/node_modules/npm/lib/install/deps.js:457:9)
    at failedDependency (/usr/lib/node_modules/npm/lib/install/deps.js:457:9)
    at failedDependency (/usr/lib/node_modules/npm/lib/install/deps.js:457:9)
    at failedDependency (/usr/lib/node_modules/npm/lib/install/deps.js:457:9)
    at failedDependency (/usr/lib/node_modules/npm/lib/install/deps.js:457:9)
    at failedDependency (/usr/lib/node_modules/npm/lib/install/deps.js:457:9)
    at failedDependency (/usr/lib/node_modules/npm/lib/install/deps.js:457:9)

我发现了一些 issue about that,但这不会在 v6 中修复。