Docker容器中setuptools.package-data配置不生效问题求助
我有一个名为RecordEcos的项目,基于pyproject.toml实现多摄像头录制,用PySimpleGUI做极简界面,摄像头未连接时会显示占位PNG图片。
我在pyproject.toml中配置了package-data以确保图片被嵌入wheel包:
[tool.setuptools.package-data] RecordEcos = ["*.png"]
本地ArchLinux环境(Python 3.11.8、build 1.1.1、setuptools 65.6.0)下一切正常,执行python -m build | grep Placeholder能看到图片被复制的日志,甚至不加这个配置也能正常打包图片。但推送到GitLab触发CI构建(使用python:3.11-alpine镜像),或者在本地Python 3.11的Docker镜像(alpine、slim、bookworm变体)中构建时,生成的wheel包里都没有这张图片。
GitLab CI配置如下:
build: stage: build image: python:3.11-alpine script: - pip install build - python -m build artifacts: untracked: false when: on_success expire_in: "30 days" paths: - dist/
排查方向与解决办法
确认图片的存放路径
确保PNG图片放在RecordEcos包目录下(和__init__.py同层级),setuptools的package-data仅识别包内文件。如果图片在子目录(比如RecordEcos/assets/),需修改配置:[tool.setuptools.package-data] RecordEcos = ["*.png", "assets/*.png"]检查MANIFEST.in文件
如果项目存在MANIFEST.in,它会影响setuptools的文件收集逻辑。确保文件中包含:include RecordEcos/*.png若没有MANIFEST.in,可新建一个并添加上述内容,强制setuptools包含目标图片。
锁定setuptools版本
本地使用的是setuptools 65.6.0,但CI环境中pip安装build时会自动拉取最新版setuptools,不同版本的package-data处理逻辑可能存在差异。可以在CI脚本中指定版本:script: - pip install build setuptools==65.6.0 - python -m build或者在pyproject.toml的build-system段锁定版本:
[build-system] requires = ["setuptools==65.6.0", "wheel"] build-backend = "setuptools.build_meta"验证Git追踪状态
确保PNG图片已被Git追踪(未被.gitignore排除),GitLab CI克隆代码时只会拉取已追踪的文件,若图片未被追踪,CI环境中根本不存在该文件,自然无法打包。
内容的提问来源于stack exchange,提问作者NiziL

