我只有在构建python:alpine图像时才会遇到这个问题。重现它有点痛苦,但这些是步骤:
码头工人容器设置:
$ docker run -it python:3.7-rc-alpine /bin/ash
$ pip install pbr
小型包设置,包括非 python 文件
test
├── .git
├── setup.cfg
├── setup.py
└── src
└── test
├── __init__.py
├── test.yml
└── sub_test
├── __init__.py
└── test.yml
setup.py:
from setuptools import find_packages, setup
setup(
setup_requires=['pbr'],
pbr=True,
package_dir={'': 'src'},
packages=find_packages(where='src'),
)
设置.cfg:
[metadata]
name = test
所有其他文件均为空。我将它们复制到带有docker cp test <docker_container>:/test
的容器中.
回到容器中,我现在尝试使用cd test; pip wheel -w wheel .
构建包,test/src/test
中的test.yml
将包含在其中,但test/src/test/sub_test
中的不会。
我不知道为什么会发生这种情况,因为 pbr 关于此事的(稀疏且 imo 相当混乱(文档指出
就像 AUTHORS 和 ChangeLog 一样,当你可以在 git 中找到其中的许多文件时,为什么要保留一个你希望包含的文件列表。 MANIFEST.in 生成可确保存储在 git 中的几乎所有文件(除了 .gitignore、.gitreview 和 .pyc 文件(都自动包含在您的发行版中。
我找不到一个 pbr 参数,让我显式包含一些我希望存在的文件或文件类型。
用import src/test/sub_test.test.yml
创建一个 MANIFEST.in 实际上可以解决这个问题,但我宁愿一起理解并避免这种行为。
PBR 需要 git 才能正确编译其要包含的文件列表,因此可以通过在构建包之前将 git 安装到构建环境中来解决此问题。有了高山图像,那将是apk add --no-cache git
.
PBR 使用 .git 文件来确定哪些文件应该是包的一部分,哪些不应该。简短的版本是,它从setup
中的packages
参数中抓取文件列表的交集 -call in setup.py 以及在当前签出的 git 分支中提交或暂存的所有内容。
因此,如果项目没有 .git 文件,您还需要另外执行git init; git add src
。
"错误"的原因是 pbr 默默地假设应该添加所有.py文件,无论它们是否被提交,这使得实际问题更难识别。它也只会在找不到 .git 文件时才会引发错误,如果它在那里但由于未安装 git 而无法从中获取任何信息,则不会引发错误。