原因是gatsby生成的默认站点会依赖一个包pngquant-bin
[email protected]
└─┬ [email protected]
└─┬ [email protected]
└── [email protected]
pngquant-bin会根据不同的平台,去raw.githubusercontent.com下载对应的二进制文件,当下载失败时,会从源码开始开始编译生成二进制文件,如果失败,则报错.
因为总所周知的原因,raw.githubusercontent.com在国内是被墙的.而当我们又不具备能编译pngquant-bin的环境时,导致安装失败.
通常我们能通过配置HTTP_PROXY,让终端程序通过代理来访问被墙的网络.
pngquant-bin处理下载依赖的包是bin-wrapper -> download -> got,最终是通过got来下载文件
而got并不支持直接使用环境变量来设置代理,像我们常用的使用HTTP_PROXY的值来设置代理对got无效.
got只能在使用包时手动设置代理,或者使用global-agent的方式来处理,遗憾的是在安装pngquant-bin的过程中,我还没发现能用上这两种方法的地方,如果有人知道,可以告诉我.
经过 @Renchongyi 的提醒,可以通过设置HTTP_PROXY或者用npm config set proxy来设置代理,只是必须是http协议的代理.支持的配置方式
在 imagemin/pngquant-bin#110 中有一个修复方案,可以使 bin 的下载地址可配置,不过好像并不顺利
- (作为临时方案有效)如果使用的
yarn的话,第一次安装失败之后,找到缓存中npm-pngquant-bin-5.0.2-6f34f3e89c9722a72bbc509062b40f1b17cda460-integrity/node_modules/pngquant-bin/lib/index.js,修改下载源url,将raw.githubusercontent.com/imagemin修改为npm.taobao.org/mirrors,然后重新安装即可.使用yarn cache dir可以打印出yarn缓存的位置 - 使用全局代理或者 vpn,或者使用像
Proxifier的软件专门代理node中的流量 - 如果内网有类似
Nexus私服的话,直接克隆pngquant-bin,将下载源修改掉,发布到私服上即可. - 可以配置编译环境,让
pngquant-bin能够通过编译生成,不过这并非我所长,所以没法提供更多建议.
谢谢!
我在安装
@quasar/[email protected]时,因为依赖相同,出现同样的错误getaddrinfo enoent raw.githubusercontent.com尝试过本地编译,但是未能成功
npm install --global windows-build-tools --vs2015经过你的文章启发,最后解决办法为:
使用
http-proxy-to-socks这个npm包将我本地的socks代理包裹为http代理,再通过npm config set proxy设置,重新执行安装命令就成功了。一直以为代理工具全局模式后,npm是走了梯子的ㄒoㄒ(哎,走了也没用,npm本身不支持socks代理)