先说一下背景: 公司内网里面搭了一个npm私服,一般的npm包都可以正常安装。但是像node-sass和sqlite这种源码并非js需要二次编译的包,在内网安装的时候会报二进制文件比如**.binding之类的下载失败。
这次在内网里安装sqlite的方案感觉可能比较通用,稍微记录一下探索解决方案的过程。
一开始还是常规的npm install,然后就报了如下错误:
一番查找之后,发现是sqlite的需要下载二进制包,能查到的方案分为两种:
一种是下载源码,然后本机编译。这个方法稍微了解了一下,需要在windows上面还要安装visual studio等等软件,遂放弃; 本方案的参考资料: geek-docs.com/sqlite/sqli…
第二种方法是设置二进制文件的镜像代理,如下图。这个方案在没法科学上网的时候确实可以安装成功,但是问题在于公司内网也不能搞vpn啥的,所以这个方案也不成功; 本方案的参考资料: juejin.cn/post/686448…
不过,我后面想到既然外网的电脑上可以安装成功,那直接把外网电脑上的下载的sqlite包直接放到内网里面去不就可以用了么。于是赶紧新建了一个空文件夹, 然后npm install sqlite3,然后把这个文件夹压缩上传到内网了。在项目里面直接引入,发现报错,执行npm rebuild,还是在报二进制下载失败;
后面灰心了一段时间,已经准备按照第二种方案里面搭一个静态服务器,然后把二进制文件放里面;
就先执行npm install sqlite3 -verbose来看看下载url的路径,结果不仅发现了二进制包的下载url还发现安装的时候会优先查找本地缓存,如下图
猜想一下,这个文件夹路径大概率是固定的,文件名也只是前面拼了一串乱码。那我寻思这个乱码要是每次都一样,那不就可以自己手动构造一个缓存么。带着一丝期待,又跑了一次前面的命令,结果发现这乱码还真是一样的。~~行行行,感觉要成,开个香槟先。~~这就开始手动构造缓存,先去github的上面把对应的包给down下来。
然后在npm-cache里面新建_prebuilds文件夹;再把刚刚下载的文件放里头,把文件名前面加上那串乱码;
再跑命令......好,成功安装,下班收工。
总结一下 这个方案主要是用于离线安装需要另外下载二进制预编译包的npm包,主要分为两步:
- 安装依赖,也就是node_modules部分: 这步在我的场景中是没有阻塞的,因为我们内网有个npm的私服; 但如果是在一个没有私服的内网下,这一步其实可以通过在有外网的电脑中先把npm包单独下载到某个文件夹中,然后把整个文件夹挪到内网环境里
- 下载二进制包: 关键步骤在于使用了这条命令npm install sqlite3 -verbose,让我们知道了二进制包的下载url以及安装时会查找本地缓存
最后查了一下prebuild-install的资料,瞄一眼源码发现了npm-cache里面的prebuild文件夹以及那一串乱码的来历:
- prebuild-install:juejin.cn/post/715908…
- 原来是用下载的url计算出来的,难怪每次都一样
okk,记录完毕