我仅在构建python:alpine映像时遇到此问题。复制它有点痛苦,但是这些步骤是:
Docker容器设置:
$ 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'),
)
setup.cfg:
[metadata]
name = test
所有其他文件为空。我用docker cp test <docker_container>:/test
将它们复制到容器中。
回到容器中,我现在尝试使用cd test; pip wheel -w wheel .
构建软件包,test.yml
中的test/src/test
将包括在其中,但test/src/test/sub_test
中的将不会t。
我不知道为什么会这样,因为pbr on that matter的(非常稀疏,而且imo令人困惑,)文档指出
就像AUTHORS和ChangeLog一样,当在git中找到许多文件时,为什么还要保留要包含的文件列表。 MANIFEST.in生成可确保几乎所有存储在git中的文件(.gitignore,.gitreview和.pyc文件除外)都自动包含在您的发行版中。
我找不到pbr参数,可以让我明确包含一些我希望存在的文件或文件类型。
使用import src/test/sub_test.test.yml
创建MANIFEST.in实际上可以解决此问题,但是我宁愿理解并避免这种行为。
答案 0 :(得分:1)
pbr需要git才能正确编译其文件包含列表,因此可以通过在构建软件包之前将git安装到构建环境中来解决问题。如果是高山图片,则为apk add --no-cache git
。
pbr使用.git文件来确定哪些文件应包含在包中,哪些文件不应该包含在包中。简短的版本是它从setup.py的packages
调用中的setup
参数中获取文件列表的交集,以及当前已检出的git分支中提交或暂存的所有内容的交集。 / p>
因此,如果项目没有.git文件,则还需要另外执行git init; git add src
。
发生“错误”的原因是pbr默默地假定所有.py文件都应添加,无论是否提交,这都会使实际问题更难识别。如果找不到.git文件,它也只会抛出一个错误,如果没有找到它,则不会抛出错误,但是由于未安装git而无法从中获取任何信息。