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

阅读.npmrc文件中的代理变量,但它不起作用。尽量避免手动下载所有需要的包并安装。

568750 次浏览

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

我认为像npm --proxy http://proxy-server:8080/ install {package-name}这样的东西对我有用。

我还看到了以下: npm config set proxy http://proxy-server:8080/ < / p >

设置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

请注意: http -proxy没有使用https作为协议,而是使用http

我是这样解决这个问题的:

  1. 我执行这个命令:

    npm config set strict-ssl false
    
  2. Then set npm to run with http, instead of https:

    npm config set registry "http://registry.npmjs.org/"
    
  3. Then I install packages using this syntax:

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

Skip the username:password part if proxy doesn't require you to authenticate

EDIT: A friend of mine just pointed out that you may get NPM to work behind a proxy by setting BOTH HTTP_PROXY and HTTPS_PROXY environment variables, then issuing normally the command npm install express (for example)

EDIT2: As @BStruthers commented, keep in mind that passwords containing "@" wont be parsed correctly, if contains @ put the entire password in quotes

如果有疑问,试试所有这些命令,就像我做的那样:

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或~/。这样每当我打开一个终端,我就知道我的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. Then edit the "username", "password", and "proxy" fields in the code you pasted.

  3. Open a new terminal

  4. Check your settings by running npm config list and cat ~/.npmrc

  5. Try to install your module using

    • npm install __, or
    • npm --without-ssl --insecure install __, or
    • override your proxy settings by using npm --without-ssl --insecure --proxy http://username:password@proxy:8080 install __.
    • If you want the module to be available globally, add option -g
$ npm config set proxy http://login:pass@host:port
$ npm config set https-proxy http://login:pass@host:port

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

安装cordova插件

安装代理http://XX.AA.AA.BB:8080

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

sudo NPM config set proxy http://proxy_host:port -g < /代码> < / p >

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

sudo NPM config set http -proxy http://proxy_host:port -g < /代码> < / p >

这对我来说在Windows中是有效的:

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

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

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

如果您的密码包含特殊字符,如"@:等,请将它们替换为URL编码值。例如" - > %22 @ - > %40, : - > %3A%5C用于字符@0。

这对我很管用。

.设置http和https代理

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

清除使用的所有代理选项

npm config rm proxy
npm config rm https-proxy

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

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

Windows系统

尝试删除代理和注册表设置(如果已经设置),并通过命令行设置环境变量

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

然后尝试运行NPM install。这样,你就不用在.npmrc中设置代理了,但是对于那个会话,它是可以工作的。

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

$ npm配置代理“http://192.168.1.101:4128

$ npm配置http -proxy“http://192.168.1.101:4128

其中192.168.1.101为代理IP, 4128为端口。根据您的代理设置进行更改。这对我很有用。

尝试在C:\Users\.npmrc中找到。npmrc

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

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

PS:请删除“<”和“>”!!

对我来说,尽管python等都可以工作,但我们的公司代理npm不会。

我试着

npm config set proxy http://proxyccc.xxx.ca:8080 NPM配置http -proxy https://proxyccc.xxx.ca:8080 NPM配置注册表http://registry.npmjs.org/

按照指示,但总是得到相同的错误。

只有当I remove时 https-proxy https://proxyccc.xxx.ca:8080 从.npmrc文件 那 NPM安装电子——save-dev工作

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

我改变了

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

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

也许这是一个边缘情况,但希望它能帮助到一些人。

这对我很管用

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

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

你可以在你的环境中添加变量HTTP_PROXYHTTPS_PROXY,它们的值都是一样的

http://user:password@proxyAddress:proxyPort

例如,如果你有Windows,你可以添加代理如下:

如何在Windows上看

vim ~/.npmrc在你的Linux机器,并添加以下。不要忘记添加registry部分,因为这在很多情况下会导致失败。

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

在我的情况下,我忘记在配置文件中设置“http://”(可以在C: \Users \ [USERNAME] \ .npmrc中找到)代理地址。所以我们不需要

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

我有

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

这当然没有工作,但错误消息也没有多大帮助…

虽然已经有很多好的建议,但对于我的环境(Windows 7,使用PowerShell)和最后一个可用的node.js版本(v8.1.2),上述所有都不起作用,除非我遵循brunowego设置。

检查你的设置:

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

希望这能节省别人的时间

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

这解决了我的问题。

在最后捆绑了不同的答案后,@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

对于这个问题,上面有很多答案,但没有一个对我有用。它们都提到要添加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

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

在curl的页面SSL和证书问题上有很好的信息。 我的答案大部分基于这里的信息。

使用strict-ssl false是不好的做法,可能会产生问题。我们可以做的是添加由“中间人”注入的证书。证书。

如何在Windows上解决这个问题:

  1. 根据Mozilla的CA包从旋度下载CA证书。您还可以使用curl的“firefox-db2pem.sh”;shell脚本转换本地Firefox数据库。
  2. 访问使用https的网页,例如Chrome或Internet Explorer中的Stackoverflow
  3. 点击锁图标,点击“查看证书”或“有效性”;在Chrome
  4. 进入“认证”路径。顶部证书或根证书是我们想要提取的证书。点击该证书,然后“查看证书”;
  5. 点击第二个选项卡“details”。点击“复制到文件”。选择DER格式,并记下保存文件的位置。选择一个合适的文件名,比如rootcert.cer
  6. 如果你安装了Git,你就会安装openssl.exe。否则,在此阶段为windows安装git。openssl可执行文件很可能位于C:\Program Files\git\usr\bin\ openssl.exe。我们将使用openssl将文件转换为PEM格式,以便NPM能够理解它。

  7. .
  8. 使用以下命令转换步骤5中保存的文件 openssl x509 -inform DES -in **rootcert**.cer -out outcert.pem -text
    其中rootcert是你在第5步中保存的证书的文件名
  9. 打开outcert。Pem在文本编辑器中足够智能,可以理解行结束符,所以不是记事本。
  10. 找到-----BEGIN CERTIFICATE----- 很多角色 -----END CERTIFICATE-----并复制它们之间的所有文本,也包括BEGIN / END行
  11. 现在,我们将把该内容粘贴到步骤1中创建的CA Cert包的末尾。所以在你的高级texteditor中打开cacert.pem。转到文件末尾,将上一步的内容粘贴到文件末尾。(保留刚才粘贴内容下面的空行)
  12. 复制保存的cabundle。Pem到一个合适的地方。例如您的%userprofile%或~。注意文件的位置。
  13. 现在我们将告诉npm/yarn使用新的bundle。在命令行中,输入
    npm config set cafile **C:\Users\username\cacert.pem**
    其中C:\Users\username\cacert.pem是第10步的路径
  14. 可选:再次打开strict-ssl, npm config set strict-ssl true

唷!我们成功了!现在npm可以理解如何连接了。额外的好处是,您可以告诉curl使用相同的cabundle。pem,它也能理解HTTPs。

最后,我已经设法解决了这个问题背后的代理与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/

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

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

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

    npm config set cafile npm_certificate.cer < / p >

  4. 对文件进行如下修改: <代码>注册表= https://registry.npmjs.org/ strict-ssl = false https-proxy = http:// [proxy_user]: [proxy_password] @ [proxy_ip]: [proxy_port] / cafile = npm_certificate.cer < /代码> < / p > < /李>

现在你应该准备好了!

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

这对我很有用,希望对你也有用:)

去环境变量和删除或设置为空

HTTP_PROXY和HTTPS_PROXY

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

我只是有我的份额与npm和代理设置的斗争,因为我不喜欢其他的答案,我喜欢分享我认为这个问题应该如何解决(妥协安全不是一个选项)。

医生怎么说

首先,你必须了解与代理相关的npm的重要设置:

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

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

注意,v6的noproxy文档没有提到任何关于环境变量的内容,而v7以来 NO_PROXY环境变量被提到了。我的环境中 没有配置验证此变量如何工作(如果包含小写版本)

合适的配置

现在我正在配置docker image,它应该在代理后面使用,在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提供给npm configcafile可以解决使用代理时证书的所有问题。

重要提示

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)

我找到了一些关于这个问题,但这不会在v6中被修复。

在npm中使用代理,安装忘掉所有的NPM配置和简单的在代理环境中设置HTTP代理变量,然后执行npm i

export https_proxy=http://proxy.address.com:1090/
export http_proxy=http://proxy.address.com:1090/

这对我来说总是有效的。

我不知道为什么,但NPM似乎不能很好地与socks代理,但它与HTTP代理工作得很好。