基于本地Git提交构建Python发行包的本地实现方法
基于Git实现Python包本地打包(复用Git追踪规则+额外排除)
核心思路
直接复用Git已定义的文件追踪规则,避免在pyproject.toml或MANIFEST.in中重复维护文件包含/排除列表,同时支持叠加少量额外排除规则,确保打包内容与Git提交/标签同步,版本号与Git标签对齐。
方法1:用git archive导出干净代码后打包
这种方式完全基于Git已提交内容生成打包目录,可手动添加额外排除:
- 导出当前Git提交(或指定标签)的所有追踪文件到临时目录:
# 导出HEAD指向的提交内容到temp_package目录 git archive HEAD --format=tar | tar -x -C ./temp_package - 在临时目录中删除需要额外排除的文件/目录:
rm -rf ./temp_package/notes ./temp_package/test_outputs - 进入临时目录执行打包命令:
cd ./temp_package python -m build - 打包完成后,
dist/目录下的文件即为干净的发行版,可直接上传PyPI。
方法2:通过setuptools_scm自动关联Git追踪与版本
利用setuptools_scm工具,让打包流程自动读取Git追踪文件和版本信息,同时支持配置额外排除规则:
- 在
pyproject.toml中配置构建后端和依赖:[build-system] requires = ["setuptools>=61.0", "setuptools_scm"] build-backend = "setuptools.build_meta" [tool.setuptools_scm] # 可选:控制版本生成逻辑,比如基于标签+提交次数 version_scheme = "post-release" - 添加额外排除规则到
pyproject.toml:[tool.setuptools.exclude-package-data] # 对所有包排除指定文件/目录 "*" = ["*.tmp", "notes/**/*", "test_outputs/**/*"] - 直接运行打包命令,
setuptools_scm会自动:- 仅包含Git追踪的文件(忽略未追踪的临时文件)
- 从Git标签/提交记录生成版本号
- 应用配置的额外排除规则
python -m build
版本同步与发布流程
- 完成代码提交后,打对应版本的Git标签:
git tag v1.0.0 git push origin v1.0.0 - 基于该标签打包(方法1中替换
HEAD为标签名v1.0.0,方法2会自动读取标签版本) - 上传PyPI时,版本号会与Git标签完全一致,实现仓库历史与PyPI版本同步。
注意事项
- 确保所有需要纳入发行包的文件已被Git追踪(
git add并提交) - 未提交的文件不会被打包,避免临时文件混入发行版
- 额外排除规则仅需维护少量特殊文件,无需重复Git已有的忽略规则
内容的提问来源于stack exchange,提问作者o17t H1H'S'k
相关产品推荐
相关产品推荐

