前端发版自动化实战:打包时自动更新版本号并展示 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 手动截取成短的

相关推荐
Cloud_bread19 小时前
从ReAct到自主闭环:Agentic Coding核心执行引擎的技术演进
前端·react.js·前端框架
cidy_9819 小时前
OptMem 使用教程
前端
杉氧19 小时前
用 Compose 挑战交互与动效天花板:ComposeCraftLab 开源实验室全解析
android·前端·kotlin
Canace20 小时前
AI 生成到 90% 突然断了:你的解决方案是?
前端·人工智能
TinssonTai20 小时前
Vite 8 版 Chrome 插件全家桶,popup/options/sidepanel 一次集齐
前端·vue.js
玉鸯20 小时前
让 Agent 面向用户:AG-UI 协议构建 Agent 前端
前端·python·agent
程序员黑豆20 小时前
鸿蒙应用开发 @Extend 装饰器使用教程
前端·harmonyos
杨先生哦20 小时前
【2026热端攻防系列 10/12】前端凭据安全深度攻防:Cookie/Storage劫持、会话固定、凭据泄露与浏览器最新加固方案
前端·笔记·安全·web安全
莫石20 小时前
坦克打无人机模拟(three-tile 地形)
前端
hunterandroid21 小时前
[鸿蒙从零到一] HarmonyOS 任务调度与并发模型实战:taskpool、Worker 与可取消任务
前端