Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save XYShaoKang/ae657eb81279528cca718c678be28215 to your computer and use it in GitHub Desktop.
Save XYShaoKang/ae657eb81279528cca718c678be28215 to your computer and use it in GitHub Desktop.
使用 gatsby cli 生成一个新的站点时,卡在安装`pngquant-bin`的临时解决办法

gatsbyjs/gatsby#20389

原因:

原因是gatsby生成的默认站点会依赖一个包pngquant-bin

gatsby-starter-default@0.1.0
└─┬ gatsby-plugin-sharp@2.6.1
  └─┬ imagemin-pngquant@6.0.1
    └── pngquant-bin@5.0.2

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 的下载地址可配置,不过好像并不顺利

  1. (作为临时方案有效)如果使用的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缓存的位置
  2. 使用全局代理或者 vpn,或者使用像Proxifier的软件专门代理node中的流量
  3. 如果内网有类似Nexus私服的话,直接克隆pngquant-bin,将下载源修改掉,发布到私服上即可.
  4. 可以配置编译环境,让pngquant-bin能够通过编译生成,不过这并非我所长,所以没法提供更多建议.
@Renchongyi
Copy link

谢谢!
我在安装@quasar/icongenie@2.2.0时,因为依赖相同,出现同样的错误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代理)

@XYShaoKang
Copy link
Author

@Renchongyi 我试了下,确实可以正常安装.

有点纳闷,又重新研究了下源码,发现bin-wrapper依赖的download版本是7.1.0的,download在4月2号升级到8.0.0的时候移除了代理的选项,而我当时看的是download@8.0.0的源码,就一直以为没有办法从外部设置代理了,没注意到bin-wrapper依赖的不是最新版的 😂 .download@7.1.0还是有内置获取代理的配置

使用socks代理无效的问题,我也调试了下,代理依赖的包download -> caw -> tunnel-agent.因为底层使用的tunnel-agent模块不支持socks,所以配置socks代理无效,而我一直用的是socks的代理,配置在HTTP_PROXY后下载无效,我就认为是因为不支持使用HTTP_PROXY来配置代理,加上后来看源码里面没有任何地方有去获取环境中的代理,就更加确信这种想法了.而其实只要配置的是http协议的代理,就可以正常下载了.还是不严谨了:thinking:

@AndyFong
Copy link

AndyFong commented Jun 4, 2020

You saved my life !!! ❤

@xkungfu
Copy link

xkungfu commented Dec 31, 2020

国内为什么没有人做一个专用代理服务器给大家安装github应用时提供方便?
政府,公司,个人,众筹都可以研究一下呀。

@happy-func
Copy link

国内为什么没有人做一个专用代理服务器给大家安装github应用时提供方便?
政府,公司,个人,众筹都可以研究一下呀。

还是拆长城吧

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment