背景: 公司内网电脑不能连接任何外部网络,在使用angular4时由于不能使用npm网络仓库,所以需要搭建内网离线仓库。直接的做法是在联网的电脑上搭建成功后,将所有工具转移到离线的电脑上。通过网络搜索后发现,使用sinopia搭建npm私有仓库是最合适的做法。摘录最好的一篇博客:https://www.cnblogs.com/LittleSix/p/6053549.html
1. 首先采用windows7(办公系统)搭建,npm install -g sinopia时确认依赖工具,解决办法卡死。但发现sinopia已成功install,所以继续启动sinopia,完全可行。至此一切顺利,并且尝试通过搭建的私服install bootstrap和jquery都能成功。但是install @angular/cli(所有以@开头的)
都不行。然后怀疑和前面sinopia的报错有关。
2. 在无可奈何的情况下,自己电脑安装虚拟机,安装linux环境搭建,期间遇到各种install失败的奇葩问题,但怀疑和公司网络有关,此处均不列举。但要指出,上述博客的搭建过程中,在直接install sinopia时遇到一个错误,这个在linux环境下需要先install node-gyp,作者遗漏此点。在网络通常的情况下,按照博客中的过程去做,应该其他的都很顺利。
3. 各项都很顺利以后,install @angular/cli仍然失败,在经过长时间的百度之后,一无所获。最后选在翻墙使用google,在sinopia的github上找到解决办法(github是个好东西,以前就有感觉,在开源的系统遇到不可知的问题,要先想到githun的issue中找解决办法):https://github.com/rlidwka/sinopia/issues/399。这里讲的很详细。
4. 具体摘录如下:此问题是当前版本sinopia的bug,在未来版本中应该会修复,当前版本的解决办法有两个:第二个是在install有关@的项目时不走私服,而直接从npm外仓库install。显然不符合我们的目的,因为这样我们的私有仓库中就不会存在@angular/cli等类似的包。第一个方法是修改sinopia:
First you must update your config.yaml
section:
packages: '@*/*': # scoped packages access: $all publish: $authenticated proxy: npmjs
in default config.yaml there is no proxy setting.
Then in sinopia/lib/up-storage.js
change code on line number 10
var encode = function(thing) { return encodeURIComponent(thing).replace(/^%40/, '@'); };
补充: 如果服务器是离线的,本地电脑也肯定是离线的才需要搭建npm离线私服。这种情况下搭建成功的私服在install @angular/cli可能会遇到Cannot download node-sass的某个文件的情况。具体为什么会需要下载,这个我不知道具体原因,但是我知道解决办法:使用其他途径下载需要下载的文件,然后将其添加进npm-cache\node-sass文件夹中。