GitLab流水线构建Python Wheel时缺失指定文件夹及数据
检查Git是否忽略了目标文件夹
GitLab CI拉取代码时只会包含Git追踪的文件,如果skolnado/myfolder1里的文件没被Git追踪(比如在.gitignore中被排除,或未执行git add提交),CI环境里根本不存在这些文件,自然无法打包进去。
操作步骤:- 本地执行
git check-ignore skolnado/myfolder1/*,排查是否有被忽略的文件 - 确保目标文件夹下所有需要打包的文件都已通过
git add添加并提交到仓库
- 本地执行
统一CI与本地的setuptools版本
不同版本的setuptools对manifest.in的解析逻辑可能存在差异,本地正常但CI异常大概率是版本不匹配导致的。
操作步骤:- 本地执行
pip show setuptools记录当前版本号 - 在GitLab CI的依赖安装脚本或
requirements.txt中指定固定版本,例如pip install setuptools==<你的本地版本>
- 本地执行
改用
package_data显式指定(替代或补充manifest.in)
部分CI环境下include_package_data=True结合manifest.in的配置可能出现兼容性问题,直接在setup.py中用package_data显式声明更可靠:setup( # 其他原有配置... package_data={ 'skolnado': ['myfolder1/**/*'], }, include_package_data=True, )注意:路径是相对于包目录
skolnado的,**/*表示递归包含该文件夹下所有子文件与子目录确认CI流水线的工作目录
确保CI执行打包命令时处于项目根目录(即setup.py与manifest.in所在目录),如果CI脚本中切换了目录,会导致找不到manifest.in配置文件。
操作步骤:在CI脚本的打包命令前添加pwd确认当前路径,或通过cd命令切换到正确的项目根目录用现代打包工具替代
setup.py bdist_wheel
旧的setup.py打包方式兼容性较差,改用build工具更稳定,它会自动处理pyproject.toml、setup.cfg等现代配置文件:- CI环境中安装build工具:
pip install build - 替换打包命令为:
python -m build --wheel
同时可将manifest.in的配置迁移到pyproject.toml中,示例:
[tool.setuptools.package-data] "skolnado" = ["myfolder1/**/*"]- CI环境中安装build工具:
在CI中添加文件存在性验证
在打包前先检查目标文件夹是否存在,避免因代码拉取失败导致的文件缺失问题。例如在CI脚本中添加:ls -la skolnado/myfolder1/如果输出为空,说明CI环境中无目标文件,回到第一步排查Git追踪情况
内容的提问来源于stack exchange,提问作者econoline

