跳转到主要内容

setuptools的插件,用于构建FreeBSD包

项目描述

setuptools插件,提供用于构建FreeBSD包的bdist_pkg命令。

如何使用?

只需将setuptools-pkg添加到您的setup.py中的setup_requires

setup(
    name="myproject",
    version="1.0.0",
    ...
    setup_requires=["setuptools-pkg"]
)

完成后,将可以使用setup.py bdist_pkg命令生成dist/myproject-1.0.0.tgz包。

如果您不想或不可以使用构建时依赖项,也可以通过将setuptools-pkg作为常规Python包安装来实现相同的效果。

如果您需要构建(实际上,您想)txz包,并且您使用的是Python 2,您应该指定包含 lzma 支持的 lzma-2.7 额外选项。对于Python 3,由于它已经内置,因此无需此选项。

高级使用

好吧,这太简单了。在现实世界中,事情并不像我们希望的那样简单。

每个项目都有依赖项,除非它很幸运。对于我们希望保留信息的包,但突然之间,FreeBSD中的包可能不同于PyPI中的包名,或者由于包含的补丁而版本不同。也就是说,我们需要它们之间的映射。让我们以这个项目为例

setup(
    ...,
    # Typically, our dependencies looks like this:
    install_requires=[
        'setuptools>=18.2',
    ],
    extras_require={
        'lzma-2.7': [
            'backports.lzma==0.0.6',
        ],
    },
    # The `command_options` is the way to specify parameters for setuptools
    # commands from the `setup()` call. Alternatively, you can do that in
    # `setup.cfg`.
    command_options={
        # bdist_pkg is the name of command setuptools_pkg provides
        'bdist_pkg': {
            # The requirements mapping itself. The __file__ instructs
            # setuptools from where these values came from. Required.
            # The rest is our mapping.
            'requirements_mapping': (__file__, {
                # The key of this mapping is an exact value of a requires
                # list.
                'setuptools>=18.2': {
                    # The value is a FreeBSD pkg metadata: package name,
                    # origin and version.
                    'name': 'py27-setuptools',
                    'origin': 'devel/py-setuptools',
                    # In our example setuptools>=18.2 tells us to pick
                    # any version of setuptools greater than 18.2 and we
                    # explicitly picks package with strict version 20.0.
                    #
                    # Please note, that version field is required while
                    # it's not in MANIFEST file.
                    'version': '20.0'
                },
                # Mapping for extras is optional till the moment you
                # want to make a package with these extras on.
                'backports.lzma==0.0.6': {
                    'name': 'py27-backports_lzma',
                    'origin': 'devel/py-backports_lzma',
                    'version': '0.0.6'
                }
            }),
            # bdist_pkg turns all the extras into options and through
            # selected options you can choose which ones will be enabled
            # for a package. By default all the options are in "off" state.
            'selected_options': [
                'lzma-2.7',
            ]
        }
    }
)

常见的陷阱

  1. 需求映射不可移植。在您的pkg存储库中可能有不同的版本和不同的包命名。

  2. 需求映射应该是最新的。

  3. 没有检查映射项是否正确。您应该注意您放入其中的内容。

  4. 使用 requirements.txt 而不是在 setup.py 中使用 install_requires 将会使您的生活更加艰难,因为从技术上讲,您的项目没有依赖项,我们无法帮助您保持一致性。您将不得不直接指定 deps 命令属性,并且 bdist_pkg 无法确保您拥有该项目实际使用的所有包。

这可能会觉得相当无聊。然而,如果您的包仓库中的所有依赖项都与 PyPI 上的名称相同,并且具有 Python 版本前缀(如 py35-setuptools),则需求映射是可选的。您只需使用以下方式创建包

python setup.py bdist_pkg --use-pypi-deps

专家使用

在专家模式下,您可能可以按照您喜欢的任何方式配置包生成。以下是您可以为 bdist_pkg 指定的完整选项列表

  • abiarch:为包制作的 FreeBSD 架构和 ABI。如果您在非 FreeBSD 系统上构建包或您的分发不是纯净的,则必须手动指定它们。

  • categories:包类别的列表(字面意义)。默认情况下,使用项目元数据的 description 字段。

  • comment:注释是此包的单行描述。默认情况下,使用项目元数据的 description 字段。

  • deps:包依赖项。有时包可能依赖于非 Python 项目,例如提供服务或库的项目,这些项目与您的项目动态链接。deps 规范的格式与 +MANIFEST 文件中的格式相同,只是它是 Python 字典,而不是 JSON 或 UCL。对于 Python 依赖项,请参阅下面的 requirements_mapping

  • desc:包的更详细描述。默认情况下,使用项目元数据的 long_description 字段。

  • groups:要提供的组列表。

  • license:项目许可。默认情况下,使用项目元数据的 license 字段。

  • maintainer:维护者的电子邮件地址。Python 分发定义了维护者和作者实体,它们控制包。默认情况下,如果可用,则选择维护者,如果不可用,则回退到作者。

  • name:包名称。由于 FreeBSD 包通常使用自己的命名策略,因此可以使用自定义名称而不是实际的项目名称。

  • options:包选项。默认情况下,此列表从 extras 中填充。

  • selected_options:用于此包构建的选项列表。

  • origin:默认情况下,设置为通用的来源 devel/py-{project_name}

  • prefix:此包包含的文件安装的路径(通常为 /usr/local)。

  • provides:包提供的功能/服务列表。

  • requires:请求功能/服务包的列表。

  • requirements_mapping:PyPI 需求与 FreeBSD 包之间的映射。此映射有助于确保所有在 install_requiresextras_require 中指定的依赖项都通过系统包得到满足。结果填充 deps 选项。

  • scripts:[包脚本](https://wiki.freebsd.org/pkgng#Scripts)。

  • users:要提供的用户列表。

  • version:包版本。与包名称一样,它可以不同于实际项目的版本,具体取决于本地修改、补丁、纪元等。

  • www:项目 URL。

常见问题解答 (FAQ)

  • 它与 pytoport 有何不同?

    pytoport项目可以从PyPI上的模块生成ports。它在这一点上做得很好,但bdist_pkg解决的是不同的问题,尤其是在你的项目无法发布到PyPI时。

  • 我怎样才能为某个任意的Python项目制作一个包呢?

    你必须先对其进行修补,以便它能够生成包含依赖项、元数据和其它组件的正确包。但说真的,你最好一直使用ports。

  • 如果我应该使用ports来制作包,那么这个项目为什么还存在呢?

    在我这个例子中,我们有一些内部项目,我们直接打包,而不使用任何ports或手动制作Makefile。

项目详情


下载文件

下载适用于您平台文件的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分发

setuptools-pkg-0.9.tar.gz (19.4 kB 查看哈希值)

上传时间 源代码

构建分发

setuptools_pkg-0.9-py3-none-any.whl (15.1 kB 查看哈希值)

上传时间 Python 3

setuptools_pkg-0.9-py2.py3-none-any.whl (15.1 kB 查看哈希值)

上传时间 Python 2 Python 3

支持者:

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面