使用Sinopia搭建私有npm仓库不能下载带有@符号的包
2017-08-02 18:12
363 查看
前言
这篇文章主要记录自己在项目中搭建好npm仓库后遇到的坑,并不是讲如何搭建私有npm仓库1、为什么要搭建私有npm仓库?
并非每一个公司都需要搭建私有npm仓库来管理代码,这个要视公司需求而定,由于我司的产品面向的客户很多,而不同的客户对这个产品的功能要求不一,打个比方:我公司现在开发了A,B,C三个模块,而客户一的产品只需要A,B模块,客户二的产品只需要A,C模块,客户C的产品只需要B,C模块,客户D的产品需要A,B,C模块,这就是我司的场景。当然你可以说你选择拷贝代码就行了,何必搞这么麻烦,那么当我没说,其实实现业务模块的打包非常明显的好处就是,我可以写一套脚本帮我下载产品所需要的包,然后组合在一起打包发布,就成了一个新的产品,这就是自动化的好处。然后就是基于这个技术栈的项目可能有多个,所以有一些组件是可以共用的,所以我司计划自己封装一些市面上没有的组件,然后组成一个组件库,给公司的多个项目使用,然后公网上有的包就去公网上下载就行了2、如何搭建私有npm仓库?
由于本文并不是介绍如何搭建私有npm仓库的文章,关于如何搭建私有npm仓库请访问该链接->如何搭建私有npm仓库 ,关于如何搭建私有npm仓库,那篇文章已经讲解的非常清晰了,这里只提一点就是,私有npm仓库是可以配置代理的公有仓库地址的,解释详细点就是:你的私有仓库里没有的npm包,它就会去你配置的代理地址找npm包。代理仓库的地址可以在config.yaml配置文件里面
uplinks:npmjs:url:http://registry.npm.taobao.org/进行配置,详细请参考上面的如何搭建私有npm仓库链接的文章
3、搭建好私有npm仓库后遇到什么坑?
我发现使用nrm切换到私有npm仓库对应的源后,下载带@符号的包都下载失败,比如下载
@angular/core,就会下载失败,这是为什么呢,查阅了一些资料,发现这其实是Sinopia自己的bug,bug产生的原因就是:
sinopia在代理到npmjs.org公有库时将@符号转码为%40,致使在公有库中找不到对应的包,返回404,简单点说就是
@angular/core代理请求的时候被转换成了
%40angular/core,所以我们需要在代理请求发出之前将其转回
@angular/core
4、如何解决?
修改sinopia源码:修改位于sinopia/lib/up-storage.js文件第10行:将var encode = encodeURIComponen;,更改为:
var encode = function(thing) {return encodeURIComponent(thing).replace(/^%40/, '@');};,这段代码的含义就是将%40转回@,于是就解决了不能下载带有@符号的npm包的bug
5、更好的解决方案?
由于sinopia的作者已于二年前停止对sinopia的维护和升级,所以出来了一个sinopia的fork,名字叫做Verdaccio,然后由Verdaccio继续对sinopia进行更新和维护,具体如何使用Verdaccio来构建私有npm服务器,请见Verdaccio的github介绍相关文章推荐
- 使用Sinopia搭建私有npm仓库
- 使用sinopia 搭建私有npm服务器的教程
- 使用cnpm搭建企业内部私有NPM仓库
- 【玩转树莓派】使用 sinopia 搭建私有 npm 服务器
- 【玩转树莓派】使用 sinopia 搭建私有 npm 服务器
- 使用cnpm搭建私有NPM仓库 发布npm包
- 使用 satis 搭建一个私有的 Composer 包仓库 在我们的日常php开发中可能需要使用大量的composer包,大部份都可以直接使用,但在公司内部总有一小部份包是不能公开的,这时候我们就需
- 【玩转树莓派】使用 sinopia 搭建私有 npm 服务器
- 使用cnpm搭建企业内部私有NPM仓库
- CentOS 7 : Docker私有仓库搭建和使用
- 拥抱 Android Studio 之四:Maven 仓库使用与私有仓库搭建
- 使用Gradle和Sonatype Nexus 搭建私有maven仓库
- 使用Harbor搭建Docker私有镜像仓库服务
- Jenkins 持续集成平台构建之使用nexus搭建maven私有仓库
- 使用官方 docker registry 搭建私有镜像仓库及部署 web ui
- 使用aliyun镜像源下载镜像及仓库搭建
- 使用 npm 私有仓库安装依赖遇到的坑
- 【转】使用CNPM搭建私有NPM
- Maven 仓库使用与私有仓库搭建
- 使用 harbor 搭建 docker 私有镜像仓库