原因是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
能够通过编译生成,不过这并非我所长,所以没法提供更多建议.
@Renchongyi 我试了下,确实可以正常安装.
有点纳闷,又重新研究了下源码,发现
bin-wrapper
依赖的download
版本是7.1.0
的,download
在4月2号升级到8.0.0
的时候移除了代理的选项,而我当时看的是[email protected]
的源码,就一直以为没有办法从外部设置代理了,没注意到bin-wrapper
依赖的不是最新版的 😂 .[email protected]
还是有内置获取代理的配置使用
socks
代理无效的问题,我也调试了下,代理依赖的包download -> caw -> tunnel-agent
.因为底层使用的tunnel-agent
模块不支持socks
,所以配置socks
代理无效,而我一直用的是socks
的代理,配置在HTTP_PROXY
后下载无效,我就认为是因为不支持使用HTTP_PROXY
来配置代理,加上后来看源码里面没有任何地方有去获取环境中的代理,就更加确信这种想法了.而其实只要配置的是http
协议的代理,就可以正常下载了.还是不严谨了:thinking: