自动化版本控制:standard-version入门介绍

前言

在整理项目工作流程的过程中,我寻求一种方法,使得项目发布时能够依据每次的代码提交(commit)自动创建变更日志(changelog)。为了实现这一目标,我开始探索并研究了standard-version这一工具。

简介

standard-version 是一个版本控制的工具,它使用基于 Conventional Commits 约定的 semver 和 CHANGELOG 。

如何使用

首先你的仓库需要遵从 Conventional Commits 规范,当你准备发布时,执行 standard-version 命令。 执行该命令时,会做以下处理:

  1. 通过查看 packageFiles 检查当前版本,返回到最后一个 git tag;
  2. 基于 commits 调整 bumpFiles 中的版本;
  3. 基于 commits 生成 changelog;
  4. 创建一个新的 commit,该 commit 包含 bumpFiles 中的文件和更新后的 CHANGELOG 文件;
  5. 创建一个新的 tag;
  • packageFiles: 定义版本的文件,默认为package.json;在不指定版本时,standard-version会从该文件读取当前版本号,并且发布时会修改该文件中的版本号;如果读取不到,会报错;
  • bumpFiles:需要修改版本号的文件;可以为多个;

配置

配置文件支持.versionrc, .versionrc.json, .versionrc.js

js 复制代码
module.exports = {
  "types": [
    { "type": "feat", "section": "✨ Features | 新功能" },
    { "type": "fix", "section": "🐛 Bug Fixes | Bug 修复" },
    { "type": "docs", "section": "✏️ Documentation | 文档" },
    { "type": "style", "section": "💄 Styles | 风格" },
    { "type": "refactor", "section": "♻️ Code Refactoring | 代码重构" },
    { "type": "perf", "section": "⚡ Performance Improvements | 性能优化" },
    { "type": "test", "section": "✅ Tests | 测试" },
    { "type": "revert", "section": "⏪ Revert | 回退", "hidden": true },
    { "type": "build", "section": "📦‍ Build System | 打包构建" },
    { "type": "chore", "section": "🚀 Chore | 构建/工程依赖/工具" },
    { "type": "ci", "section": "👷 Continuous Integration | CI 配置" }
  ],
  skip: {
    bump: false,
    changelog: false,
    commit: false,
    tag: false
  },
  debug: true,
  dryRun: true,
  packageFiles: [{ filename: 'package.json', type: "json" }],
  bumpFiles: [
    { filename: 'package.json', type: "json" },
    { filename: 'package-lock.json', type: "json" }
  ],
  scripts: {
    "prebump": "echo 9.9.9"
  }
}

生命周期脚本

允许在 release 过程中执行自定义的命令;支持周期如下:

  • prerelease: 在最开始执行,如果该脚本返回一个非零状态码,发布过程将被中断;
  • prebump postbump: 在修改版本之前/之后执行;如果 prebump 返回一个版本,将会使用该版本;
  • prechangelog postchangelog: 在生成 CHANGELOG 之前/之后执行;
  • precommit postcommit: 在 commit 之前/之后执行;
  • pretag posttag : 在 tag 之前/之后执行;

跳过生命周期

skip 可以允许执行时跳过对应的阶段,支持 bump changelog commit tag;

dryRun

当设置 dryRuntrue 时,你可以在命令行看到命令所执行的结果,而不会改变原有仓库;

版本号

默认情况下,standard-version 会根据 commit 记录自动计算发布的版本号;以下以 1.0.0 版本为例:

  • 当 commit 记录包含 fix 时,1.0.0 -> 1.0.1;
  • 当 commit 记录包含 feat 时,1.0.0 -> 1.1.0;
  • 当 commit 记录包含 BREAKING CHANGE 或者 ! 时,1.0.0 -> 2.0.0;

总结

通过使用standard-version,项目维护者可以更加专注于代码的开发和功能的改进,而不必担心版本发布过程中繁琐的版本号管理和变更日志的编写。这个工具不仅简化了版本控制的流程,还有助于保持项目历史的清晰和透明,使得其他开发者和用户能够轻松追踪项目的进展和变更。

此外,standard-version的配置灵活性允许项目根据具体需求进行定制,无论是通过简单的配置文件还是通过生命周期脚本的高级用法。这种灵活性意味着standard-version可以适应不同规模和复杂度的项目,从而在各种开发环境中发挥作用。

通过标准化的提交信息和自动化的发布流程,standard-version促进了更好的团队协作和沟通。开发者可以通过明确的提交规范来传达他们的工作重点,而维护者可以轻松地从变更日志中获取重要信息,以便于编写发布说明和更新文档。

相关推荐
秋月华星22 分钟前
【flutter】TextField输入框工具栏文本为英文解决(不用安装插件版本
前端·javascript·flutter
千里码aicood1 小时前
[含文档+PPT+源码等]精品基于Python实现的校园小助手小程序的设计与实现
开发语言·前端·python
青红光硫化黑1 小时前
React基础之React.memo
前端·javascript·react.js
大麦大麦1 小时前
深入剖析 Sass:从基础到进阶的 CSS 预处理器应用指南
开发语言·前端·css·面试·rust·uni-app·sass
m0_616188493 小时前
Vue3 中 Computed 用法
前端·javascript·vue.js
六个点3 小时前
图片懒加载与预加载的实现
前端·javascript·面试
Patrick_Wilson3 小时前
🔥【全网首篇】30分钟带你从0到1搭建基于Lynx的跨端开发环境
前端·react.js·前端框架
Moment4 小时前
前端 社招 面筋分享:前端两年都问些啥 ❓️❓️❓️
前端·javascript·面试
Moment4 小时前
一坤时学习 TS 中的装饰器,让你写 NestJS 不再手软 😏😏😏
前端·javascript·面试
子洋4 小时前
AnythingLLM + SearXNG 实现私有搜索引擎代理
前端·人工智能·后端