前端发版自动化实战:打包时自动更新版本号并展示 commitId

最近在项目中做了个优化项,就是打包时自动更新版本号,在页面上展示当前应用的版本信息。

  • 版本号 :来自 package.json,方便业务层面区分不同版本。
  • commitId:来自 Git,表示当前版本号对应代码仓库里的具体提交。

最终效果大概是这样的:

scss 复制代码
当前版本:v1.2.3 (a1b2c3d)

实现步骤

1. 使用 npm version 管理版本

在发版时,不要手动改 package.json,而是用 npm 自带的 npm version 命令

perl 复制代码
# 小版本更新
npm version patch -m "chore(release): %s"
​
# 中版本更新
npm version minor -m "chore(release): %s"
​
# 大版本更新
npm version major -m "chore(release): %s"

执行后会自动:

  • 修改 package.jsonpackage-lock.json 的版本号
  • 打 git tag
  • 生成一次 commit,tag 与版本号强绑定

这样可以保证版本号和 git 历史保持一致。

css 复制代码
# 推送代码和 tag
git push origin main --tags

2. 获取 tag 版本对应的 commitId

javascript 复制代码
import { execSync } from 'child_process';
​
function getCommitId(version: string) {
  try {
    // 获取 tag 对应的 commitId
    return execSync(`git rev-parse --short v${version}^{}`).toString().trim();
  } catch {
    // 如果 tag 不存在
    throw new Error(`Tag v${version} 不存在,请先执行 npm version 并推送 tag`);
  }
}

3. 将版本信息注入到打包结果

vite.config.ts 里进行配置:

javascript 复制代码
import { defineConfig } from 'vite';
import pkg from './package.json';
​
const version = pkg.version;
const commitId = getCommitId(version);
​
export default defineConfig({
  define: {
    __APP_VERSION__: JSON.stringify(version),
    __APP_COMMIT__: JSON.stringify(commitId),
  },
});

4. 页面展示

javascript 复制代码
export default function AppVersion() {
  return (
    <footer>
      <p>
        版本号: {__APP_VERSION__} (commit: {__APP_COMMIT__})
      </p>
    </footer>
  );
}

这样每次发版,页面都会展示正确的版本号和对应的 commitId。


提示

页面中使用 APP_VERSIONAPP_COMMIT 时,TS 报错: TS2304: Cannot find name __COMMIT_ID__

src 目录下添加类型声明即可解决

php 复制代码
// env.d.ts
/// <reference types="vite/client" />
declare const __APP_VERSION__: string
declare const __COMMIT_ID__: string

git rev-parse --short v${version}^{} 命令解析

作用: 解析一个 revision(tag/branch/HEAD/commit)到 commitId。

--short : 输出 短格式(默认前 7 位)

为什么要写 ^{} :

执行 npm version patch 时,Git 会创建一个 注解标签(annotated tag) ,这种标签会:

  • 创建一个标签对象
  • 创建一个标签引用(指向标签对象)

所以当执行 git ls-remote --tags origin 可以看到远程仓库中有两个 tag:

  • refs/tags/v1.0.2 - 标签对象
  • refs/tags/v1.0.2^{} - 实际的提交

最终在仓库中看到的 commitId 是带 ^{} 。所以在通过 tag 获取 commitId 的时候也要带上 ^{}

也可以通过 git rev-list -1 v${version} 获取到完整的 commitId 手动截取成短的

相关推荐
万少1 天前
HarmonyOS 开发必会 5 种 Builder 详解
前端·harmonyos
橙序员小站1 天前
Agent Skill 是什么?一文讲透 Agent Skill 的设计与实现
前端·后端
炫饭第一名1 天前
速通Canvas指北🦮——基础入门篇
前端·javascript·程序员
王晓枫1 天前
flutter接入三方库运行报错:Error running pod install
前端·flutter
符方昊1 天前
React 19 对比 React 16 新特性解析
前端·react.js
ssshooter1 天前
又被 Safari 差异坑了:textContent 拿到的值居然没换行?
前端
曲折1 天前
Cesium-气象要素PNG色斑图叠加
前端·cesium
Forever7_1 天前
Electron 淘汰!新的桌面端框架 更强大、更轻量化
前端·vue.js
Angelial1 天前
Vue3 嵌套路由 KeepAlive:动态缓存与反向配置方案
前端·vue.js
jiayu1 天前
Angular学习笔记24:Angular 响应式表单 FormArray 与 FormGroup 相互嵌套
前端