接着之前的思路,现在我们已经完成了项目的初始化构建,然后开始往里面写新的package。
在写入的package后就需要涉及到上传的问题了,如果是开源项目,那直接使用lerna的publish命令即可。但是比如一些公司的技术沉淀之类的整合,有很多是不适合直接公开在网络上的,所以需要的是上传私有库。比起npm的私有包的方案,其实我更倾向于搭建私有npm仓库的做法。一来,代码是存储在自己的服务器的。二来,lerna也默认不允许直接发布私有包。
目前网络上开源的构建私有npm的框架很多。最出名的就是淘宝cnpm开源的cnpm.org,这个库可以说把整个cnpm的功能都实现的,功能十分强大。不过代价就是搭建十分麻烦,而且较为不稳定,时常出现奇怪的bug。
对于普通公司来说,其实并没有那么全的功能需求的,其实只要满足基本的功能就足够使用了。所以这里我选择的是一个十分小众的框架CPM
这个框架的搭建十分简单,按照官方文档搭建,很快便可以搭建成功。不过有几个要注意的点:
在导入数据库的时候,文档说的很模糊。其实根目录下有一个database.sql文件,如果你不是使用navcat之类的图像化工具,那么你就需要用mysql命令登入mysql,然后:
> create database cpm;
> use cpm;
> source ./database.sql;
因为他提供的sql文件本身不会去创建数据库,所以你需要自己去创建,并切换。
不同于cnpm.org,cnpm.org使用了两个端口,一个用作仓库,一个用作web服务。对于cpm来说,他只会暴露一个端口。在不修改package.json的情况下,dev模式是7002,production是7001。所以会出现一些问题。比如文档建议在上线时,将config设置中的registryHost直接修改成你的域名,不带端口。并且示例中使用的也直接是域名。这样就会带来一个问题,你的服务跑在了7001端口,但是你的仓库被设置成了80端口。看起来能用。但是当你上传package后,就会发现没法下载,因为80端口去找下载包就会出现404错误。解决方法,要么保持registryHost是7001端口,要么去修改package.json为80端口,然后重新上传package。
对于数据库配置,如果你的数据库不是跑在默认的3306端口,在设置plugin的时候需要手动加上port这个字段。(还好字段名称没有被作者魔改)
因为私有包必须以自身的scope为前缀命名,比如@exampleScope/packageName,所以请务必记住 将自己公司用的scope名称添加到app/service/authorization.js允许的scope数组中,不然可能会无法上传。
对于package的命名,除了需要一scope作为前缀,同时还需要注意的是不可以使用驼峰法,请务必使用中划线分割单词。因为驼峰法会被分割成多级目录的格式。这样的话会触发cpm的一个bug,如果安装时一般的包找不到会包一个json格式的错误,说本地没有这个包。如果是这种被分割成了多级目录,由于没有触发到路由的匹配,所以会报一个404的文本回来,从来导致本地触发报错说json数据解析失败,数据非法什么的。
同时,不知道是不是作者大意了,cpm会读取本地packages目录下的文件来查询已有的本地模块文件,不过他默认没有新建这个文件夹,所以需要手动在cpm根目录新建packages文件夹,不然fs模块会报错说路径不存在。
在搭建好了自己的npm仓库后,就可以开始尝试发布自己的模块了。因为我们私有的模块是基于npm的,所以记住,千万不能在配置文件中将lerna的client设置成“yarn”。
然后,我们可以:
git add .
git-cz
lerna publish --registry=http://xxxx.com:7001
使用git-cz格式化我们的commit,然后使用lerna publish命令。lerna会帮我们将代码push到github对应的分支,同时依次将各个模块上传到私有的npm仓库中,同时还会修改每个package的版本号,然后去修改每个相互依赖package的版本号。
注意点: