3

我只在构建 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

设置.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.ymlintest/src/test将包含在其中,但 intest/src/test/sub_test不会。

我不知道为什么会发生这种情况,因为 pbr关于这个问题的文档(非常稀疏,而且 imo 非常混乱)指出

就像 AUTHORS 和 ChangeLog 一样,当您可以在 git 中找到许多文件时,为什么还要保留一个您希望包含的文件列表。MANIFEST.in 生成确保几乎所有存储在 git 中的文件(.gitignore、.gitreview 和 .pyc 文件除外)都自动包含在您的分发中。

我找不到一个 pbr 参数,可以让我明确地包含一些我希望存在的文件或文件类型。

创建一个 MANIFEST.inimport src/test/sub_test.test.yml实际上解决了这个问题,但我宁愿理解并避免这种行为。

4

1 回答 1

2

pbr 需要 git 才能正确编译其 files-to-include 列表,因此可以通过在构建包之前将 git 安装到构建环境中来解决问题。使用高山图像,那将是apk add --no-cache git.


pbr 使用 .git 文件来确定哪些文件应该是包的一部分,哪些不应该。简短的版本是它从setup.py 中的 -call 中的packages参数中获取文件列表的交集,以及在当前签出的 git 分支中提交或暂存的所有内容。setup

因此,如果项目没有 .git 文件,您还需要额外执行git init; git add src

“错误”的原因是 pbr 默默地假设所有 .py 文件都应该被添加,无论它们是否被提交,这使得实际问题更难识别。它也只会在找不到 .git 文件时抛出错误,如果它存在则不会抛出错误,但由于未安装 git 而无法从中获取任何信息。

于 2018-07-07T07:14:58.867 回答