Node项目文档生成工具standard-release

news2024/11/25 12:56:33

简介

爱美之心人皆有之。本文就介绍如何使用standadr-release自动生成好看的Git提交记录文档。

背景

作为一只程序猿,Git代码管理工具相信大家都用过,那么Git提交记录想必大家也都看过,不管是用什么工具查看,多多少少都感觉乱,但部署个人博客时发现,Vanblog发布版的更新日志(Changelog)都很漂亮,而且都链接到了每一次的提交记录,这样就很漂亮,你觉得呢?

本文就来记录我理解的standran-release的使用方法,如有错误敬请指正!

(打个广告,使用Vanblog搭建的个人博客【oldmoon】,欢迎指教)

提交信息规范

首先,使用一些工具,就要遵守这个工具一些规矩,standard-release则需要提交记录的信息说明要符合一定的规范。

大家都知道,在提交一次Git时,需要写一些这次提交的信息说明,即commit messagestandard-release就是需要你的这些commit message符合一定的规范。

这个规范起初好像是Angular社区提出的AngularJS Git Commit Message Conventions,中文文档:Angular提交信息规范。现在已经算是Git通用规范了,standard-release相关说明文档则是指向Conventional Commits,文档是纯英文的,英文不好的朋友们可以自行翻译。不想看也可以,下边我会挑一些重要内容说明。

整体规范

规范要求commit message的整体大概要是这个样子:

<type>(<scope>): <subject>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>

解析commit message可分为三部分:header(头部)、body(身体)、footer(脚部)。<BLANK LINE>即空白行,这一点见仁见智,不想留空白行就不要写。

  • header:信息的头部,即<type>(<scope>): <subject>,头部是最重要的部分下面会单独说明。
  • body:本次提交的详细说明,如果提交内容不多(或懒得写),可以只写和header中的<subject>,问题不大🤐。
  • footer:本次提交的关联信息。不知道大家知道github上的issues吗,简单来说就是一些需求或bug在issues上提出,如果你本次提交的内容与某个需求或bug有关联,就在最后加上说明,写法如:#1,其中1issue的ID。

header

header分为三部分,<subject>最简单,本次提交的概述,自己根据实际情况写即可,没有硬性要求,但typescope就相对严格一些,下面详细说明。

type

即本次提交的类型,如:新功能、BUG修复、文档提交、架构调整等等,这部分都有固定的单词,需要强制使用这些单词,不要自己造词哦,常用类型如下。

  • feat (feature):新版本、新功能
  • fix (bug fix):bug修复
  • docs (documentation):文档相关
  • style (formatting, missing semi colons, …):不影响代码含义的修改,比如空格、格式化、缺失的分号等
  • refactor:代码重构(不改变任何逻辑、功能的代码修改)
  • test (when adding missing tests):添加测试用例
  • chore (maintain):代码架构调整

scope

这部分在standard-release的规范里是可选的,只有一些特殊场合用到,目前我只发现在创建新tag时会用到,如:chore(release: 0.43.0),而且这次提交记录是standard-release自动提交的,也就是说平常我们基本不会用到scope这部分。。

实例

  • 直接上大佬的实例吧,懒得手打了

工具使用

上面讲了基本的代码提交规范,下边就是具体的工具使用了。

作为非专业人员,接触node不是很多,看vanblog源码和standard-release官方说明好久才大致理解了使用方法,如有错误请一定指出!

根据我的理解,要想形成Changelog这样好看的文档,只需三步:1、添加standard-release依赖;2、添加配置文件;3、运行指令生成文档。接下啦就分别讲解每一步的具体工作。

添加standard-release依赖

  • 以开发环境依赖安装(推荐):
npm i --save-dev standard-version
  • 全局安装:
npm i -g standard-version

安装完成后,建议在项目的package.json文件中增加相应脚本,我的配置如下,仅供参考

{
  "name": "cashbook",
  "version": "0.0.9",
  "private": true,
  "scripts": {
    "tag-major": "standard-version --release-as major",
    "tag-minor": "standard-version --release-as minor",
    "tag-patch": "standard-version --release-as patch",
    "release-docs": "node scripts/changelog.js"
  },
  "devDependencies": {
    "standard-version": "^9.5.0"
  }
}

添加配置文件

  • 项目根目录下添加.versionrc.js/versionrc.json文件,官方说明:conventional-changelog-conventionalcommits

  • 官方配置说明:conventional-changelog-config-spec

  • 本文以.versionrc.js文件为例:

module.exports = {
  header: "# Changelog",
  commitUrlFormat: "https://github.com/{{owner}}/{{repository}}/commit/{{hash}}",
  compareUrlFormat:"https://github.com/{{owner}}/{{repository}}/compare/{{previousTag}}...{{currentTag}}",
  issueUrlFormat:"https://github.com/{{owner}}/{{repository}}/issues/{{id}}",
  types: [
    { type: "feat", section: "🛴 Features | 新功能" },
    { type: "fix", section: "🚑 Bug Fixes | Bug 修复" },
    { type: "init", section: "🛫 Init | 初始化" },
    { 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 | 回退" },
    { type: "build", section: "⚓ Build System | 打包构建" },
    { type: "chore", section: "🚩 Chore | 构建/工程依赖/工具" },
    { type: "ci", section: "⛽ Continuous Integration | CI 配置" },
  ],
};

说明一下配置项:

  • header:即文件标题,因为生成的是md文件,所以使用markdown语法。
  • commitUrlFormat:文档中链接到提交记录时,url的格式
  • compareUrlFormat:文档中链接到tag比较时,url的格式
  • issueUrlFormat:文档中链接到issue时,url的格式
  • types:具体文档内容的格式,这个不多说了,根据上面讲的type自己对应看,应该能看明白吧。

补充:之所以配置三个UrlFormat,是因为我本地有多个Git帐号,导致自动生成的URL是我本地的配置,直接上传到github之后是链接不到的,所以在这配置上正确地址格式。关于Git多账号,可以阅读《GitHub使用SSH连接》,其中有讲解多用户配置。

运行指令生成文档

根据阅读和使用,使用standard-version工具,项目的版本号应该是三级,如:1.2.1,相应总结出三个常用指令:

# 升级大版本
standard-version --release-as major
# 升级小版本
standard-version --release-as minor
# 升级补丁版本
standard-version --release-as patch

三条指令相对应三个数字,每次执行会自动在对应的数字上加一,当然,如果是升高级版本,低级版本的数字会被置0,如1.2.1升级大版本后应该是2.0.0

提示:指令运行成功后,会自动帮你把相关文件都提交了,但只是提交到本地分支,不会帮你推送到远程仓库,你需要手动将相关提交和tags推送。运行命令git push --follow-tags origin main将相关tags推送到仓库。

完结

以上,就是全部standard-version的使用方式方法介绍,感谢你的阅读。但是还没完,经过阅读Vanblog源码发现,Mereith大佬还写了一个自动推送的脚本,并且会执行一些特殊操作,下边介绍一下他的脚本。

拓展:自动推送Git的js脚本

  • 脚本源码,我理解的注释写在源码里,自行阅读体会吧。
  • 其中有两次推送tags,是因为Git的tag有两种类型,需要不同命令来推送。
const insertLog = () => {
  // standard-version自动生成的文档内容读取,并修改标题(这是大佬个性化的需求)
  const fs = require("fs");
  const log = fs.readFileSync("CHANGELOG.md", { encoding: "utf-8" });
  const newLog =
    "---\ntitle: 更新日志\nicon: update\n---\n\n" +
    log.replace("# Changelog", "");

  fs.writeFileSync("docs/ref/changelog.md", newLog, { encoding: "utf-8" });
  // 读取一个叫doc-version的文件,并将版本号+1
  let version = fs.readFileSync("doc-version", { encoding: "utf-8" });
  version = version.split("\n")[0].trim();
  const arr = version.split(".");
  const sub = arr.pop();
  arr.push(String(parseInt(sub) + 1));
  const newVersion = arr.join(".");
  fs.writeFileSync("doc-version", newVersion, { encoding: "utf-8" });

  // 添加并应用:执行shell命令的工具,用于执行git相关命令
  const { execSync } = require("child_process");
  execSync(
    // 添加文件 && 提交 && 创建分支,其中分支版本是上面从doc-version文件读到处理后的 && 推送tags && 推送tags
    `git add . && git commit -m 'docs: 更新文档' && git tag doc-${newVersion} && git push --follow-tags origin master && git push --tags`,
    (err, stdout, stderr) => {
      if (err) {
        console.log(err);
        return;
      }
      console.log(`stdout: ${stdout}`);
    }
  );
};
insertLog();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/90589.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GoC2018下册 第2课(C++画图)

慧通教育 慧通教育 709.改变身高&#xff08;下册第2课&#xff09; 登录 710.改变身高&#xff08;下册第2课&#xff09; 登录 711.改变体型&#xff08;下册第2课&#xff09; 登录 712.改变体型&#xff08;下册第2课&#xff09; 登录 713.完美身材&#xff08;下册第…

类型转换和优先级

目录 一、表达式求值 二、隐式类型转换 1、整型提升的意义 2、如何进行整型提升&#xff08;3个例子&#xff09; 三、算术转换 四、操作符的属性 1、优先级顺序表 2、运算法则 一、表达式求值 表达式求值的顺序一部分是由操作符的优先级和结合性决定。 同样&#xff0c;有…

C++ Reference: Standard C++ Library reference: Containers: map: map: swap

C官网参考链接&#xff1a;https://cplusplus.com/reference/map/map/swap-free/ 函数模板 <map> std::swap (map) template <class Key, class T, class Compare, class Alloc> void swap (map<Key,T,Compare,Alloc>& x, map<Key,T,Compare,Alloc…

融捷能源携手企企通,打造智能化、数字化采购平台

随着全球能源危机和环境污染问题日益突出&#xff0c;节能、环保有关行业的发展被高度重视&#xff0c;全球能源消费结构正向低碳化转型&#xff0c;加快发展可再生能源已经在全球范围内形成共识。 作为新能源产业的核心&#xff0c;锂电池技术和产业的发展也备受关注&#xff…

中断线程化

中断线程化 中断处理程序包括上半部硬件中断处理程序&#xff0c;下半部处理机制&#xff0c;包括软中断、tasklet、workqueue、中断线程化。 当一个外设中断发生后&#xff0c;内核会执行一个函数来响应该中断&#xff0c;这个函数通常被称为中断处理程序或中断服务例程。 上…

G631两级电液伺服阀控制器

G631系列两级电液伺服阀在电气液压伺服系统中作为执行元件&#xff0c;在伺服系统中液压执行机构同电气及气动执行机构相比&#xff0c;具有快速性好、单位重量输出功率大、传动平稳、抗干扰能力强等特点。另一方面&#xff0c;在伺服系统中传递信号和校正特性时多用电气元件。…

数据结构---散列表

散列表哈希函数散列表读写写读扩容总结散列表也叫作 哈希表&#xff08;hash table&#xff09;&#xff0c;这种数据结构提供了键&#xff08;Key&#xff09;和值&#xff08;Value&#xff09;的映射关系。只要给出一个Key&#xff0c;就可以高效查找到它所匹配的Value&…

如何使用HTML制作个人网站(如何搭建个人博客)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

Datawhale 202212 设计模式 | 第二章 23种设计模式

23种设计模式讲解策略模式问题&#xff1a;解决方案&#xff1a;效果&#xff1a;适用场景&#xff1a;实际应用&#xff1a;优点缺点&#xff1a;实例&#xff1a;装饰 6问题&#xff1a;解决方案&#xff1a;效果&#xff1a;代理 7问题&#xff1a;解决方案&#xff1a;效果…

(附源码)springboot球鞋文化交流论坛 毕业设计 141436

目 录 摘要 1 1 绪论 1 1.1 研究意义 1 1.2研究方法 1 1.3论文结构与章节安排 1 2 球鞋文化交流论坛分析 3 2.1 可行性分析 3 2.2 系统流程分析 3 2.2.1数据增加流程 3 2.3.2数据修改流程 4 2.3. 数据删除流程 4 2.3 系统功能分析 4 2.3.1 功能性分析 4 2.3.2 非功能性分析 5 …

【MySQL】说透锁机制(二)行锁 加锁规则 之 范围查询(你知道会锁表吗?)

本文会按照 聚集集索->唯一索引->普通索引 的顺序 地毯式分析 范围查询中 <、<、>、> 的行锁情况&#xff0c;锁表分析在唯一索引 章节&#xff0c;万字长文&#xff0c;力求分析全面&#xff0c;很硬核全网独一份&#xff0c;别忘了收藏&#xff01; 当然如…

中学课程辅导杂志中学课程辅导杂志社中学课程辅导编辑部2022年第34期目录

教育视点《中学课程辅导》投稿&#xff1a;cn7kantougao163.com 基于整体英语教学理念的初中英语读写课研究 徐杰; 3-5 初中语文阅读教学的有效追问策略 徐生; 6-8 初中音乐教学中融入美育的实践探讨 张静; 9-11 “让学引思”理念下的初中物理高效课堂构建 张敏…

部署Neo4j +Rasa+Rasa UI

一、前言 最近在学习kbqa&#xff0c;调研时发现gitee上有关于多轮对话系统源码&#xff0c;该仓库主要是基于rasa框架&#xff08;python语言&#xff09;实现&#xff0c;并且带有web的UI配置&#xff0c;相当于比较全面的对话平台。Rasa UI 可以基于客户已有的平台&#xf…

西电雨课堂测试大合集【导航】

文章目录基础写作 一、二科学道德与学风研究生的压力与心理健康学术规范与论文写作中国传统文化✨感谢各位博主的分享&#xff01; &#x1f4d2;我在这里只是进行了一些整理&#xff0c;方便大家查找。 ⚠️大家看完可以给博主们点点赞、收藏、关注。&#x1f601; 祝各位学业…

Linux机器安装Nginx配置并实现双向认证

Linux机器安装Nginx配置并实现双向认证 一.Nginx的安装配置 Nginx(“engine x”)是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器&#xff0c;也是一个 IMAP/POP3/SMTP 代理服务器。 在高连接并发的情况下&#xff0c;Nginx是Apache服务器不错的…

TiDB | TiDB在5A级物流企业核心系统的应用与实践

TiDB在5A级物流企业核心系统的应用与实践前言一、业务背景科捷物流概况神州金库简介二、现状与挑战神州金库现有技术体系业务挑战应对方案三、TiDB解决方案测试迁移收益问题四、说在最后前言 历经了近半年的测试验证和迁移准备&#xff0c;神州金库3.0核心系统 WMS 正式从 MyS…

力扣(LeetCode)152. 乘积最大子数组(C++)

序列dp f[i]f[i]f[i] 表示以 iii 结尾的连续子数组的最大乘积&#xff0c;d[i]d[i]d[i] 表示以 iii 结尾的连续子数组的最小乘积 。 如果只有正数&#xff0c;我们只需要考虑最大乘积 f[i]f[i]f[i] &#xff1b;有负数&#xff0c;需要考虑与负数相乘的数&#xff0c;越小越好…

【unity】基础交互入门(碰撞交互事件OnTriggerEnter和OnCollisionEnter)

一、碰撞交互事件OnTriggerEnter 1、在场景中添加两个几何体&#xff08;例如Cube和Sphere&#xff09; 2、添加Rigidbody&#xff08;刚体&#xff09;component 点击Cube&#xff08;正方体&#xff09;对象&#xff0c;在面板找到这个按钮&#xff0c;添加component 搜索…

Zabbix6.0使用教程 (五)—zabbix从二进制包安装上篇

大家好&#xff0c;我是乐乐。上一期我们已经讲过从源代码安装zabbix&#xff0c;本期着重讲从二进制包安装zabbix。 当我们在ZABBIX官方存储库可以看到&#xff0c;Zabbix SIA 提供如下官方RPM和DEB包&#xff1a; Red Hat Enterprise Linux/CentOS Debian/Ubuntu/Raspbian …

即时通讯音视频开发编码H.264的特点与优势

即时通讯应用中的实时音视频技术&#xff0c;几乎是IM开发中的最后一道高墙。原因在于&#xff1a;实时音视频技术 音视频处理技术 网络传输技术 的横向技术应用集合体&#xff0c;而公共互联网不是为了实时通信设计的。 国际上制定视频编解码技术的组织有两个&#xff0c;一…