在我们日常Coding过程中,经常会有开发类库的需求

开发完成发布之后,后续版本管理,更新日志等问题也随之而来,如何解决这些问题呢?

一、手打

  • 手动更改版本号
  • 手动变成更新日志
  • 手动发布到npm私服
  • 噢耶,完工
你确定你是认真的么❓️❓️❓️手动黑人问号脸 都2020年了还不能自动化吗?

二、自动化

回到正题,如果有一种工具,我们只需要简单输入命令行,轻轻敲一下回车,就可以轻松帮我们完成手动的那些工作,。我们只需要噢耶,岂不快哉。

于是,在伟大的github上捕捉到了以下三种工具

  • standard-version
  • semantic-release
  • lerna

让我们来详细的分别了解一下这三位选手

1、Lerna

不用说。先淘汰吧😂️。毕竟这家伙核心价值是多项目管理,跟我们的需求毫不沾边

2、standard-version

根据介绍,它的核心价值观在于语义化版本控制、打tag以及CHANGELOG生成。更为加分的是它还是代码提交规范组织的官方出品
sv

A utility for versioning using semver and CHANGELOG generation powered by Conventional Commits.

听上去蛮符合我们的要求,使用方法也简单

standard-version

基本上可以满足我们的日常需求。使用起来也满足我们的初始目标,一键Enter,搞定所有,我们只需要将更改推送到服务器,并且发布就好

git push --follow-tags origin master && npm publish

3、semantic-release

打开文档介绍,原来这货的核心驱动力在于workflow。

semantic-release automates the whole package release workflow including: determining the next version number, generating the release notes and publishing the package.

相比楼上那位,该选手给我们提供了一整套完备的工作流,通过它我们可以:

  • 全自动release
  • 强制语义化说明
  • 插件化配置
  • 与CI/CD默认集成
    剩下的还有好多。。。大家可以去官网看。。。

使用方法
A、使用的话会稍微复杂一点,类似babel,需要在项目中增加一个 .releaserc 文件进行插件配置

{
"branches": "master",
// "debug": true,
// "dryRun": true, // semantic-release默认在ci中工作,如果需要调试可以打开这个开关
"plugins": [
"@semantic-release/commit-analyzer",
"@semantic-release/release-notes-generator",
"@semantic-release/changelog",
[
"@semantic-release/npm",
{
"npmPublish": true,
"tarballDir": "dist"
}
],
[
"@semantic-release/git",
{
"assets": ["package.json", "CHANGELOG.md"],
"message": "chore(蛋糕):${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"
}
],
[
"@semantic-release/gitlab",
{
"gitlabUrl": "https://git.com/",
"assets": "dist/*.tgz"
}
]
],
"preset": "angular"
}

B、同时需要在ci中增加配置,在项目中配置CI所需要的环境变量,包括GL_TOKENNPM_USERNAMENPM_EMAILNPM_PASSWORD

stages:
# - test
- release

before_script:
- npm install

publish:
image: node:10
stage: release
script:
- echo '//registry.npm.org/:username=${NPM_USERNAME}'>>.npmrc
- echo '//registry.npm.org/:email=${NPM_EMAIL}'>>.npmrc
- echo '//registry.npm.org/:_password=${NPM_PASSWORD}'>>.npmrc
- npx semantic-release

C、最重要的一点,需要在gitlab中开启PersonalAccessToken前提是开启2FA配置,照着步骤走,挺麻烦的也能走通后来发现不用开启2FA也能走通,那可太棒了),并设置在CI/CD的变量中
pat

D、上述步骤做好,便可以把所有改动推送到远程仓库,坐等它带给你的惊喜

哈哈,其实除了跟楼上一样的效果之外,还额外生成了gitLab中的Release。当然如果不需要的话也可以干掉它,不过这么专业的操作,为啥不保留呢,对不对~😄️

4、standard-version VS semantiv-release

功能点 standard-version semantic-release 说明
版本控制 会根据提交的信息类型来自动更改对应的版本号,如下:
feat: 次版本(minor)+1
fix: 修订号(patch) +1
BREAK CHANGE: 主板号(marjor) +1
CHANGELOG 均基于Angular Commit 规则
gitTag标记
npm自动发布
CI集成 ⚠️️ standard-version 可以手动实现
pre-release实现 standard-version:通过可选参数
semantic-release:通过分支设置
gitlab release

三、结论

standard-version与semantic-release 都是令人惊叹的工具,不管使用哪一个都能够最大限度的满足我们的需求。当然两个工具的侧重点是不一样的。所以我们可以根据自己的喜好来选择。
在我个人看来:

standard-version 偏向于小工具开发,自行决定类库的版本,并且可以在发布前进行修改 semantic-release 偏向于workflow,多人协作下通过mr进行需求的迭代
当然,无论采取哪种姿势,我们的核心目标只有一个:

killAllHumans
完~