1、支持pyinstaller打包方式

2、将python打包其他参数都放入params中
This commit is contained in:
2026-05-20 15:59:51 +08:00
parent 4c51a7f8d5
commit d36618d101
7 changed files with 829 additions and 59 deletions

235
README.md
View File

@@ -10,8 +10,9 @@
gitver
gitver rewrite [PEType] [-f]
gitver setver=<pid> [repodir=<path>] [-test] [-setup=0|1]
gitver nuitkabuild=<pid> <mainPy> [repodir=<path>] [-test] [params="<nuitka参数>"]
gitver nuitkapydbuild=<pid> <modulePy> [repodir=<path>] [-test] [params="<nuitka参数>"]
gitver nuitkabuild=<pid> [repodir=<path>] [-test] [params="<mainPy> <nuitka参数>"]
gitver nuitkapydbuild=<pid> [repodir=<path>] [-test] [params="<modulePy> <nuitka参数>"]
gitver pyinstaller=<pid> [repodir=<path>] [-test] [params="<mainPy|specFile> <pyinstaller参数>"]
gitver -setup=0|1 <pid> [repodir=<path>] [-test]
```
@@ -22,7 +23,7 @@ gitver -setup=0|1 <pid> [repodir=<path>] [-test]
| `pid` | 产品 ID整数范围 0-65535内嵌在命令名中`setver=5` |
| `repodir=<path>` | Git 仓库目录,缺省使用当前运行目录 |
| `-test` | 将产品版本号的 major/minor 置为 0测试版本构建 |
| `params="..."` | 传递给 Nuitka 的额外参数,用双引号括起来 |
| `params="..."` | 传递给 Nuitka 或 PyInstaller 的参数(**含入口文件名**,用双引号括起来 |
**BID 规则:**
`main`/`master` 分支固定 `bid=0`;其他分支格式须为 `<描述>.<数字>`,自动读取末尾数字作为 `bid`
@@ -145,21 +146,21 @@ FileVersion=5.26.0519.3
生成版本号并调用 Nuitka 打包 Python 程序EXE 模式)。
```
gitver nuitkabuild=<pid> <mainPy> [repodir=<path>] [-test] [params="<nuitka参数>"]
gitver nuitkabuild=<pid> [repodir=<path>] [-test] [params="<mainPy> <nuitka参数>"]
```
自动调用:
```
python -m nuitka --windows-product-version=<版本> --windows-file-version=<版本> <extra> <mainPy>
python -m nuitka --windows-product-version=<版本> --windows-file-version=<版本> <params>
```
**示例:**
```
gitver nuitkabuild=5 main.py
gitver nuitkabuild=5 main.py -test
gitver nuitkabuild=5 src\app.py repodir=E:\Code\MyPyProj params="--standalone --output-dir=dist"
gitver nuitkabuild=5 params="main.py"
gitver nuitkabuild=5 -test params="main.py"
gitver nuitkabuild=5 repodir=E:\Code\MyPyProj params="src\\app.py --standalone --output-dir=dist"
```
**输出示例:**
@@ -179,27 +180,73 @@ FileVersion=5.26.0519.3
生成版本号并调用 Nuitka 打包 Python 模块pyd/DLL 模式)。
```
gitver nuitkapydbuild=<pid> <modulePy> [repodir=<path>] [-test] [params="<nuitka参数>"]
gitver nuitkapydbuild=<pid> [repodir=<path>] [-test] [params="<modulePy> <nuitka参数>"]
```
自动调用:
```
python -m nuitka --module --windows-product-version=<版本> --windows-file-version=<版本> <extra> <modulePy>
python -m nuitka --module --windows-product-version=<版本> --windows-file-version=<版本> <params>
```
**示例:**
```
gitver nuitkapydbuild=5 module.py
gitver nuitkapydbuild=5 module.py -test
gitver nuitkapydbuild=5 src\core.py repodir=E:\Code\MyPyProj params="--output-dir=dist"
gitver nuitkapydbuild=5 params="module.py"
gitver nuitkapydbuild=5 -test params="module.py"
gitver nuitkapydbuild=5 repodir=E:\Code\MyPyProj params="src\\core.py --output-dir=dist"
```
> 需要当前环境已安装 Nuitka可通过 `python -m nuitka --version` 验证)。
---
### `gitver pyinstaller=<pid>`
生成版本号并调用 PyInstaller 打包 Python 程序,支持直接传入 `.py` 入口脚本或 `.spec` 构建配置文件。
```
gitver pyinstaller=<pid> [repodir=<path>] [-test] [params="<mainPy|specFile> <pyinstaller参数>"]
```
自动调用:
```
python -m PyInstaller <params>
```
版本号照常从 Git tag 计算并输出,但 PyInstaller 本身不接受 `--windows-product-version` 等命令行参数。如需将版本信息嵌入 EXE建议在 `.spec` 文件中通过 `version=` 字段或外部 version resource 文件实现。
**两种打包模式:**
| 模式 | 参数示例 | 说明 |
|---|---|---|
| 脚本模式 | `params="main.py"` | 由 PyInstaller 自动生成 spec 并打包 |
| spec 模式 | `params="myapp.spec"` | 使用已有 spec 文件,打包配置完全由 spec 控制,`params=` 仅适用于路径类运行时选项(`--distpath` 等) |
**示例:**
```
gitver pyinstaller=5 params="main.py"
gitver pyinstaller=5 -test params="main.py"
gitver pyinstaller=5 repodir=E:\Code\MyPyProj params="src\\app.py --onefile --name=MyApp"
gitver pyinstaller=5 params="myapp.spec"
gitver pyinstaller=5 -test params="myapp.spec"
gitver pyinstaller=5 repodir=E:\Code\MyPyProj params="myapp.spec"
```
**输出示例:**
```
PyInstaller 打包开始.. (main.py)
ProductVersion=5.0.1920.11
FileVersion=5.26.0519.3
```
> 需要当前环境已安装 PyInstaller可通过 `python -m PyInstaller --version` 验证)。
---
### `gitver -setup=0|1`(独立打包命令)
独立调用安装脚本打包,不依赖 `setver=` 命令。
@@ -217,6 +264,112 @@ gitver -setup=1 5 repodir=E:\Code\MyProj
---
## Nuitka 与 PyInstaller 常用参数速查
### Nuitka 常用参数
通过 `params="..."` 传递给 `gitver nuitkabuild=` / `nuitkapydbuild=`
| 参数 | 说明 |
|---|---|
| `--standalone` | 独立模式:将所有依赖打包进输出目录,可单独分发 |
| `--onefile` | 单文件模式:将独立包压缩为单个 EXE需配合 `--standalone` |
| `--output-dir=<dir>` | 指定输出目录,如 `--output-dir=dist` |
| `--windows-icon-from-ico=<ico>` | 设置 EXE 图标 |
| `--windows-company-name=<name>` | 设置公司名(写入文件属性) |
| `--windows-product-name=<name>` | 设置产品名 |
| `--enable-plugin=<plugin>` | 启用插件,如 `pyside6``tk-inter``numpy` |
| `--follow-imports` | 跟踪所有隐式导入(打包更完整,体积也更大) |
| `--nofollow-import-to=<mod>` | 排除指定模块不展开,如 `--nofollow-import-to=tests` |
| `--include-package=<pkg>` | 强制包含指定包 |
| `--include-data-files=<src>=<dst>` | 打包额外数据文件 |
| `--remove-output` | 打包前先清理上次输出 |
| `--lto=yes` | 启用链接时优化Release 构建推荐) |
| `--jobs=<n>` | 并行编译线程数,如 `--jobs=4` |
**典型用法示例:**
```bash
# 最小单文件 EXE
gitver nuitkabuild=5 params="main.py --standalone --onefile --output-dir=dist"
# 带图标、公司名的独立包
gitver nuitkabuild=5 params="main.py --standalone --windows-icon-from-ico=app.ico --windows-company-name=MyCompany --output-dir=dist"
# PySide6 GUI 应用
gitver nuitkabuild=5 params="main.py --standalone --enable-plugin=pyside6 --output-dir=dist"
# 打包 pyd 模块
gitver nuitkapydbuild=5 params="core.py --output-dir=dist"
# 异地仓库
gitver nuitkabuild=5 repodir=E:\Code\MyProj params="main.py --standalone --onefile --output-dir=dist"
```
---
### PyInstaller 常用参数
通过 `params="..."` 传递给 `gitver pyinstaller=`
| 参数 | 说明 |
|---|---|
| `--onefile` / `-F` | 单文件模式:打包成单个 EXE |
| `--onedir` / `-D` | 单目录模式(默认) |
| `--name=<name>` / `-n` | 指定输出文件名(不含后缀) |
| `--icon=<ico>` / `-i` | 设置 EXE 图标 |
| `--distpath=<dir>` | 指定输出目录,默认 `dist` |
| `--workpath=<dir>` | 中间文件目录,默认 `build` |
| `--specpath=<dir>` | spec 文件生成位置,默认当前目录 |
| `--noconsole` / `-w` | 不显示控制台窗口GUI 应用) |
| `--hidden-import=<mod>` | 手动指定隐式导入的模块 |
| `--add-data=<src>;<dst>` | 打包额外数据文件Windows 分隔符为 `;`Linux/macOS 为 `:` |
| `--version-file=<file>` | 从文件读入 Windows 版本信息嵌入 EXE |
| `--uac-admin` | 请求管理员权限运行 |
| `--clean` | 构建前清理缓存 |
| `--log-level=WARN` | 减少构建输出噪音,可选 `DEBUG``INFO``WARN``ERROR` |
**典型用法示例:**
```bash
# 最小单文件 EXE
gitver pyinstaller=5 params="main.py --onefile --name=MyApp"
# GUI 应用(关指控制台)
gitver pyinstaller=5 params="main.py --onefile --noconsole --icon=app.ico --name=MyApp"
# 包含资源文件
gitver pyinstaller=5 params="main.py --onefile --add-data=assets;assets --name=MyApp"
# 指定输出目录
gitver pyinstaller=5 params="main.py --onefile --distpath=dist --workpath=build --name=MyApp"
# 使用 spec 文件(配置均在 spec 中,不需要其他 params
gitver pyinstaller=5 params="myapp.spec"
# 使用 spec 并覆盖输出路径
gitver pyinstaller=5 params="myapp.spec --distpath=release"
# 异地仓库
gitver pyinstaller=5 repodir=E:\Code\MyProj params="main.py --onefile --name=MyApp"
```
**spec 文件嵌入版本信息(推荐方式):**
PyInstaller 不支持命令行版本参数。需将版本号嵌入 EXE 时,建议先用 `gitver setver=<pid>` 生成版本号,再在 spec 文件中设置 `version_file` 字段:
```python
# myapp.spec 片段
exe = EXE(
pyz,
...,
version='version_info.txt', # Windows 版本信息文件
name='MyApp',
)
```
---
## 错误码
| 码 | 含义 |
@@ -249,6 +402,11 @@ gitver -setup=1 5 repodir=E:\Code\MyProj
| 37 | 未找到安装脚本setup.iss / setup.nsi |
| 38 | 修改安装脚本失败 |
| 39 | 未找到安装编译器ISCC.exe / makensis.exe |
| 40 | `pyinstaller=` 参数不足(缺少 mainPy 或 specFile |
| 41 | `pyinstaller=` 的 pid 非法 |
| 42 | `pyinstaller=` 无法根据分支名计算 bid |
| 43 | `pyinstaller=` 读取 tag 失败 |
| 44 | `pyinstaller=` 获取当天分支提交次数失败 |
---
@@ -304,13 +462,27 @@ gitver setver=5 -test
### 验证 `nuitkabuild=`
```bash
gitver nuitkabuild=5 main.py
gitver nuitkabuild=5 params="main.py"
# 预期: 调用 python -m nuitka注入版本号参数
gitver nuitkabuild=5 src\app.py params="--standalone --output-dir=dist"
gitver nuitkabuild=5 params="src\\app.py --standalone --output-dir=dist"
# 预期: 额外参数传递给 Nuitka
```
### 验证 `pyinstaller=`
```bash
gitver pyinstaller=5 params="main.py"
# 预期: 调用 python -m PyInstaller main.py
# 输出 ProductVersion / FileVersion
gitver pyinstaller=5 params="myapp.spec"
# 预期: 调用 python -m PyInstaller myapp.specspec 模式)
gitver pyinstaller=5 params="main.py --onefile --name=MyApp"
# 预期: 额外参数传递给 PyInstaller
```
### 验证 `-setup=`
```bash
@@ -347,21 +519,34 @@ gitver setver=5 -setup=0
| 命令 | 预期返回码 |
|---|---|
| `gitver nuitkabuild=5 main.py` | 0 / 19 / 21 |
| `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 |
| `gitver nuitkabuild=5 params="main.py"` | 0 / 19 / 21 |
| `gitver nuitkabuild=5 -test params="main.py"` | 0 |
| `gitver nuitkabuild=5 params="main.py --standalone"` | 0 |
| `gitver nuitkabuild=5 repodir=E:\NotExists params="main.py"` | 23 |
| `gitver nuitkabuild=5` | 0 |
### nuitkapydbuild= 组
| 命令 | 预期返回码 |
|---|---|
| `gitver nuitkapydbuild=5 module.py` | 0 / 26 / 28 |
| `gitver nuitkapydbuild=5 module.py -test` | 0 |
| `gitver nuitkapydbuild=5 module.py params="--output-dir=dist"` | 0 |
| `gitver nuitkapydbuild=5 module.py repodir=E:\NotExists` | 23 |
| `gitver nuitkapydbuild=5` | 24 |
| `gitver nuitkapydbuild=5 params="module.py"` | 0 / 26 / 28 |
| `gitver nuitkapydbuild=5 -test params="module.py"` | 0 |
| `gitver nuitkapydbuild=5 params="module.py --output-dir=dist"` | 0 |
| `gitver nuitkapydbuild=5 repodir=E:\NotExists params="module.py"` | 23 |
| `gitver nuitkapydbuild=5` | 0 |
### pyinstaller= 组
| 命令 | 预期返回码 |
|---|---|
| `gitver pyinstaller=5 params="main.py"` | 0 / 42 / 44 |
| `gitver pyinstaller=5 -test params="main.py"` | 0 |
| `gitver pyinstaller=5 params="main.py --onefile"` | 0 |
| `gitver pyinstaller=5 params="myapp.spec"` | 0 |
| `gitver pyinstaller=5 -test params="myapp.spec"` | 0 |
| `gitver pyinstaller=5 repodir=E:\NotExists params="main.py"` | 23 |
| `gitver pyinstaller=5` | 0 |
| `gitver pyinstaller=abc params="main.py"` | 41 |
> **注意**如果打包时提示“未找到安装编译器ISCC.exe / makensis.exe请手动下载安装对应工具并将其可执行文件路径如 `ISCC.exe` 或 `makensis.exe` 所在目录)添加到系统环境变量 `PATH`。常见下载地址:
>