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

相关推荐
我只会写Bug啊1 小时前
Vue文件预览终极方案:PNG/EXCEL/PDF/DOCX/OFD等10+格式一键渲染,开源即用!
前端·vue.js·pdf·excel·预览
扯蛋4383 小时前
LangChain的学习之路( 一 )
前端·langchain·mcp
Mr.Jessy3 小时前
Web APIs学习第一天:获取 DOM 对象
开发语言·前端·javascript·学习·html
ConardLi4 小时前
Easy Dataset 已经突破 11.5K Star,这次又带来多项功能更新!
前端·javascript·后端
冴羽4 小时前
10 个被严重低估的 JS 特性,直接少写 500 行代码
前端·javascript·性能优化
rising start4 小时前
四、CSS选择器(续)和三大特性
前端·css
一 乐5 小时前
高校后勤报修系统|物业管理|基于SprinBoot+vue的高校后勤报修系统(源码+数据库+文档)
java·前端·javascript·数据库·vue.js·毕设
爱喝水的小周5 小时前
《UniApp 页面配置文件pages.json》
前端·uni-app·json
mapbar_front5 小时前
React中useContext的基本使用和原理解析
前端·react.js
贪婪的君子5 小时前
【每日一面】实现一个深拷贝函数
前端·js