去除-f参数,同时添加md文件进行说明

This commit is contained in:
Jeff
2026-05-19 15:25:29 +08:00
parent 63891dab14
commit abcbc88399
8 changed files with 479 additions and 121 deletions

372
README.md
View File

@@ -1,2 +1,372 @@
# GitVer
# 命令行版本管理工具
命令行版本管理工具,从 Git 仓库读取 tag 自动生成并回写版本号。
---
## 用法总览
```
gitver
gitver rewrite [PEType] [-f]
gitver setver=<pid> [repodir=<path>] [-f] [-test] [-setup=0|1]
gitver nuitkabuild=<pid> <mainPy> [repodir=<path>] [-f] [-test] [params="<nuitka参数>"]
gitver nuitkapydbuild=<pid> <modulePy> [repodir=<path>] [-f] [-test] [params="<nuitka参数>"]
gitver -setup=0|1 <pid> [repodir=<path>] [-f] [-test]
```
**通用参数说明:**
| 参数 | 说明 |
|---|---|
| `pid` | 产品 ID整数范围 0-65535内嵌在命令名中`setver=5` |
| `repodir=<path>` | Git 仓库目录,缺省使用当前运行目录 |
| `-f` | 未找到当前分支 tag 时使用默认 major/minor1.0)继续 |
| `-test` | 将产品版本号的 major/minor 置为 0测试版本构建 |
| `params="..."` | 传递给 Nuitka 的额外参数,用双引号括起来 |
**BID 规则:**
`main`/`master` 分支固定 `bid=0`;其他分支格式须为 `<描述>.<数字>`,自动读取末尾数字作为 `bid`
---
## 命令详解
### `gitver`(无参数交互模式)
自动读取当前分支最近三次符合 `<分支>.major.minor` 格式的 tag提示用户选择 major+1 或 minor+1二次确认后创建新 tag。
当前分支无有效 tag 时进入首发引导:提示输入默认 major/minor回车使用默认 1/0再创建首个 tag。
**交互示例(已有 tag**
```
当前分支: main最近三个 tag
main.1920.9
main.1920.10
main.1920.11
输入 1 → 创建 main.1921.0
输入 2 → 创建 main.1920.12
```
**交互示例(无 tag 首发):**
```
未找到符合规则的历史标签
输入默认 major回车=1: 2
输入默认 minor回车=0: 5
→ 创建 <分支>.2.5
```
---
### `gitver rewrite`
自动识别当前目录源码类型C++、C#、Python执行默认版本回写。
```
gitver rewrite [PEType] [-f]
```
| 参数 | 说明 |
|---|---|
| `PEType` | 可选,`1`=EXE默认`2`=DLL最多出现一次 |
| `-f` | 强制模式:未找到目标文件或回写失败仅提示,不返回错误码 35 |
**回写行为:**
- **C++**:递归查找首个 `.rc` 文件,回写 `FILEVERSION``PRODUCTVERSION``VALUE "FileVersion"``VALUE "ProductVersion"`(限定在 `VS_VERSION_INFO` 版本块内)
- **C#**:递归查找首个 `AssemblyInfo.cs`,回写 `AssemblyVersion``AssemblyFileVersion`
- **Python**:不执行回写,提示改用 `nuitkabuild=``nuitkapydbuild=`
**示例:**
```
gitver rewrite
gitver rewrite 2
gitver rewrite -f
```
---
### `gitver setver=<pid>`
从 Git 仓库读取 tag生成产品版本号与文件版本号并按源码类型自动回写。
```
gitver setver=<pid> [repodir=<path>] [-f] [-test] [-setup=0|1]
```
**版本号生成规则:**
- `ProductVersion = pid.bid.major.minor`(取当前分支前缀的最新 tag
- `FileVersion = pid.yy.mmdd.id`id = 当天当前分支提交次数)
**`-setup=N` 标志(打包模式):**
存在 `-setup=N` 时,**不回写**版本信息到项目文件,改为:
1. 在 exe 目录或上级目录查找安装脚本
2. 修改脚本中的版本号字段
3. 调用对应编译器打包
| 值 | 脚本文件 | 编译器 |
|---|---|---|
| `0` | `setup.iss` | Inno Setup`ISCC.exe` |
| `1` | `setup.nsi` | NSIS`makensis.exe` |
**示例:**
```
gitver setver=5
gitver setver=5 repodir=E:\Code\OTH\gitver
gitver setver=5 -f
gitver setver=5 -test
gitver setver=5 -setup=0
gitver setver=5 repodir=E:\Code\MyProj -setup=1
```
**输出示例:**
```
ProductVersion=5.0.1920.11
FileVersion=5.26.0519.3
```
**回写说明:**
- **C++**:回写 `.rc` 文件中的 FILEVERSION、PRODUCTVERSION 及对应字符串字段
- **C#**:回写 `AssemblyInfo.cs` 中的 AssemblyVersion、AssemblyFileVersion
- **Python**:仅输出版本号,不执行文件回写,提示改用 Nuitka 命令
- 编码:支持 ANSI/UTF-8保留 UTF-8 BOMUTF-16 文件会报错停止
---
### `gitver nuitkabuild=<pid>`
生成版本号并调用 Nuitka 打包 Python 程序EXE 模式)。
```
gitver nuitkabuild=<pid> <mainPy> [repodir=<path>] [-f] [-test] [params="<nuitka参数>"]
```
自动调用:
```
python -m nuitka --windows-product-version=<版本> --windows-file-version=<版本> <extra> <mainPy>
```
**示例:**
```
gitver nuitkabuild=5 main.py
gitver nuitkabuild=5 main.py -f
gitver nuitkabuild=5 main.py -test
gitver nuitkabuild=5 src\app.py repodir=E:\Code\MyPyProj params="--standalone --output-dir=dist"
```
**输出示例:**
```
Nuitka 打包开始..
ProductVersion=5.0.1920.11
FileVersion=5.26.0519.3
```
> 需要当前环境已安装 Nuitka可通过 `python -m nuitka --version` 验证)。
---
### `gitver nuitkapydbuild=<pid>`
生成版本号并调用 Nuitka 打包 Python 模块pyd/DLL 模式)。
```
gitver nuitkapydbuild=<pid> <modulePy> [repodir=<path>] [-f] [-test] [params="<nuitka参数>"]
```
自动调用:
```
python -m nuitka --module --windows-product-version=<版本> --windows-file-version=<版本> <extra> <modulePy>
```
**示例:**
```
gitver nuitkapydbuild=5 module.py
gitver nuitkapydbuild=5 module.py -f
gitver nuitkapydbuild=5 module.py -test
gitver nuitkapydbuild=5 src\core.py repodir=E:\Code\MyPyProj params="--output-dir=dist"
```
> 需要当前环境已安装 Nuitka可通过 `python -m nuitka --version` 验证)。
---
### `gitver -setup=0|1`(独立打包命令)
独立调用安装脚本打包,不依赖 `setver=` 命令。
```
gitver -setup=0|1 <pid> [repodir=<path>] [-f] [-test]
```
**示例:**
```
gitver -setup=0 5
gitver -setup=1 5 repodir=E:\Code\MyProj
```
---
## 错误码
| 码 | 含义 |
|---|---|
| 2 | 默认回写流程下未获取到 git 提交号 |
| 3 | 参数非法或未知参数 |
| 4 | `setver=` 的 pid 非法 |
| 5 | `setver=` 无法根据分支名计算 bid |
| 6 | `setver=` 未找到当前分支格式 tag |
| 9 | `setver=` 获取当天分支提交次数失败 |
| 15 | 回写流程未识别源码类型 |
| 16 | 回写流程识别到 Python请改用 nuitka 命令 |
| 17 | `nuitkabuild=` 参数不足(缺少 mainPy |
| 18 | `nuitkabuild=` 的 pid 非法 |
| 19 | `nuitkabuild=` 无法根据分支名计算 bid |
| 20 | `nuitkabuild=` 未找到当前分支格式 tag |
| 21 | `nuitkabuild=` 获取当天分支提交次数失败 |
| 22 | `rewrite` 参数非法PEType 非法或重复) |
| 23 | `repodir=` 不是有效目录 |
| 24 | `nuitkapydbuild=` 参数不足(缺少 modulePy |
| 25 | `nuitkapydbuild=` 的 pid 非法 |
| 26 | `nuitkapydbuild=` 无法根据分支名计算 bid |
| 27 | `nuitkapydbuild=` 未找到当前分支格式 tag |
| 28 | `nuitkapydbuild=` 获取当天分支提交次数失败 |
| 29 | 无参数模式下无法获取当前分支 |
| 30 | 无参数模式下读取标签列表失败 |
| 31 | 无参数模式下未读取到用户输入 |
| 32 | 无参数模式下用户选择非法,或 major/minor 已达上限 |
| 33 | 无参数模式下创建 tag 失败 |
| 34 | 无参数模式下创建 tag 后校验失败 |
| 35 | 未找到可回写目标文件,或回写失败 |
| 36 | `-setup=` 值不支持(仅支持 0 和 1 |
| 37 | 未找到安装脚本setup.iss / setup.nsi |
| 38 | 修改安装脚本失败 |
| 39 | 未找到安装编译器ISCC.exe / makensis.exe |
---
## 最小自测
### 基础验证:`setver=`
```bash
# 初始化测试仓库
mkdir test_repo && cd test_repo
git init
echo test > README.txt
git add . && git commit -m "init"
git tag main.1920.10
git tag main.1920.11
# 验证版本生成
gitver setver=5
# 预期:
# ProductVersion=5.0.1920.11
# FileVersion=5.yy.mmdd.<id>
# 返回码: 0
```
### 验证 `-f`(无 tag 时使用默认版本)
```bash
git checkout -b newbranch
gitver setver=5 -f
# 预期: ProductVersion=5.<bid>.1.0
# 返回码: 0
```
### 验证分支 tag 隔离
```bash
git checkout -b feature.12
git tag feature.12.1930.7
git tag feature.12.1930.8
gitver setver=5
# 预期: ProductVersion=5.12.1930.8(忽略 main.* tag
# 返回码: 0
```
### 验证 `-test`
```bash
gitver setver=5 -test
# 预期: ProductVersion=5.0.0.0major/minor 置零)
# 返回码: 0
```
### 验证 `nuitkabuild=`
```bash
gitver nuitkabuild=5 main.py
# 预期: 调用 python -m nuitka注入版本号参数
gitver nuitkabuild=5 src\app.py params="--standalone --output-dir=dist"
# 预期: 额外参数传递给 Nuitka
```
### 验证 `-setup=`
```bash
# 确保 exe 目录或上级目录有 setup.iss
gitver setver=5 -setup=0
# 预期: 修改 setup.iss 中的版本号并调用 ISCC.exe 编译
```
---
## 回归清单
### rewrite 组
| 命令 | 预期返回码 |
|---|---|
| `gitver rewrite` | 0 / 15 / 16 / 35 |
| `gitver rewrite -f` | 0 / 15 / 16 |
| `gitver rewrite 2` | 0 / 15 / 35 |
| `gitver rewrite 1 2` | 22 |
### setver= 组
| 命令 | 预期返回码 |
|---|---|
| `gitver setver=5` | 0 |
| `gitver setver=5 -f` | 0 |
| `gitver setver=5 -test` | 0 |
| `gitver setver=5 repodir=E:\NotExists` | 23 |
| `gitver setver=5 -setup=0` | 0 / 37 / 38 / 39 |
| `gitver setver=5 -setup=9` | 36 |
| `gitver setver=abc` | 4 |
### nuitkabuild= 组
| 命令 | 预期返回码 |
|---|---|
| `gitver nuitkabuild=5 main.py` | 0 / 19 / 20 / 21 |
| `gitver nuitkabuild=5 main.py -f` | 0 |
| `gitver nuitkabuild=5 main.py -test` | 0 |
| `gitver nuitkabuild=5 main.py params="--standalone"` | 0 |
| `gitver nuitkabuild=5 main.py repodir=E:\NotExists` | 23 |
| `gitver nuitkabuild=5` | 17 |
### nuitkapydbuild= 组
| 命令 | 预期返回码 |
|---|---|
| `gitver nuitkapydbuild=5 module.py` | 0 / 26 / 27 / 28 |
| `gitver nuitkapydbuild=5 module.py -f` | 0 |
| `gitver nuitkapydbuild=5 module.py params="--output-dir=dist"` | 0 |
| `gitver nuitkapydbuild=5 module.py repodir=E:\NotExists` | 23 |
| `gitver nuitkapydbuild=5` | 24 |