在npm里发布一个模块还是很容易的, 在模块目录里 npm publish
就发布好了一个模块, 这个时候模块的版本就是你package.json里的版本号(当然模块必须是没有被占位的,名字和版本都没有被占据的才可以)。
但是某些情况,我们都会发布一个alpha版本、beta版本的模块,比如connect:
# connect versions
'3.0.0-rc.1': '2014-03-06T20:38:01.961Z',
'2.14.2': '2014-03-12T01:56:42.090Z',
'2.14.3': '2014-03-18T15:08:21.115Z',
'2.14.4': '2014-04-07T20:57:11.875Z',
'2.14.5': '2014-04-24T19:33:15.518Z',
'2.15.0': '2014-05-05T04:08:51.417Z',
'3.0.0-rc.2': '2014-05-05T04:30:08.312Z',
当模块非常受欢迎时,这个rc版本可以像很多软件的nightbuild,发布给尝鲜的小白鼠们先测试, 尤其是命令行工具类型的package。
但是如果直接 npm publish
, 默认会更新tag latest
对应的版本号,这可能会误伤了很多 package.json dependencies 写成*的用户, 怎么避免这种情况呢?
先看看 npm install
npm install <PackageName>@<?>
<?> 可以是 <tag>, 可以是具体的<versionNum>
npm install fishbar
实际安装的是 fishbar模块的 latest tag指定的版本,看看connect的tag信息npm info fishbar
, 输出的信息中有:
{ name: 'fishbar',
description: 'test npm tag',
'dist-tags':
{ latest: '0.0.1',
nightbuild: '0.0.2'},
.........
dist-tags 里列出模块的所有tag, 所以可以这么解读, 当前稳定版本是 0.0.1, rc版本是0.0.1-pre, 还有一个测试版本。
用户在安装的时候 npm install fishbar
获取到的是0.0.1 版本(功能稳定), 而小白鼠用户npm install fishbar[@nightbuild](/user/nightbuild)
得到的就是一个最新测试版(不稳定但功能更强大)。
一旦0.0.2稳定之后,更新latest tag的指向
npm tag fishbar[@0](/user/0).0.2 latest
v0.0.2就上线了,无需再重新更新一个版本号。
而一旦发现bug,也可以通过上面的命令回退latest tag, 方便灵活,尤其是在npm unpublish 无法删除版本的时候,修复bug又没那么快的时候,赶紧回退latest以免干扰到模块的用户。
参考:
https://www.npmjs.org/doc/cli/npm-publish.html https://www.npmjs.org/doc/cli/npm-tag.html https://www.npmjs.org/doc/cli/npm-install.html