前言
最近遇到一个问题,我们公司自己内部开发了多个npm私有包,包之间有依赖关系,例如A依赖B。当B发现有BUG需要修复的时候,灾难来了。
我们需要先在B中修复问题,然后publish。接着在更新A的package.json中B的版本号,然后要下载B的最新版。而且在开发初始,这种情况非常频繁,而且版本号是蹭蹭往上涨。简直要疯掉~~~
分析需求
- (1)我希望B包publish之后,A包中B会自动更新为最新版本。
- (2)我希望有一个内部开发的版本(alpha),他和主版本(stable)可以并行存在。并且开发的版本经过测试验收完成之后,我们可以切换最新的alpha为stable
解决问题
- 问题1的解决办法
baidu,google之后。发现有一个叫npm link的命令。他可以创建一个软链接来解决这个问题。举个栗子:
// 我们有一个名为base的package,先将路径切换到base的目录下。
cd base
// 执行npm link之后,会将base复制到全局模块中(就像执行了npm i base -g一样)
npm link
// 我们有另外一个名为act的package,将路径切换到act的目录下。
cd act
// 通过npm link base命令,act依赖的base包会形成一个链接指向全局模块中的的base
npm link base
之后B中的代码有变更,publish之后,A会自动更新B为最新版本。他们之间的指向关系为A->global->B。问题1解决完毕。
- 问题2的解决办法
baidu,google之后,发现npm有两个命令。version和tag,两个组合使用可以解决第二个问题。举个栗子:
// (1)重点:此处注意。必须先删除package-lock.json文件
rm -f package-lock.json
// (2)发现B有个BUG,需要解决,解决完毕,并且提交git之后。执行如下命令,会创建一个n.n.n-n的version(例如0.1.5-5)
npm version prerelease
// (3)通过tag命令,我们可以创建一个和latest并行的测试版本,两者可以互相独立。
npm publish --tag alpha
// 简单操作方法:可以在package.json中创建npm命令,将修改的代码提交到git之后,执行执行此npm script就可以了。
"scripts": {
"beta": "rm -f package-lock.json && npm version prerelease && npm publish --tag beta"
}
问题2顺利解决。测试验收完毕,要上线的时候。我们将leatest的version改变下就行了。如下:
npm dist-tag add base@0.1.4 lastest
总结
将问题1和问题2的解决方案组合起来,就可以解决我遇到的问题了。完美~