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',
]
}
}
)
常见的陷阱
需求映射不可移植。在您的pkg存储库中可能有不同的版本和不同的包命名。
需求映射应该是最新的。
没有检查映射项是否正确。您应该注意您放入其中的内容。
使用 requirements.txt 而不是在 setup.py 中使用 install_requires 将会使您的生活更加艰难,因为从技术上讲,您的项目没有依赖项,我们无法帮助您保持一致性。您将不得不直接指定 deps 命令属性,并且 bdist_pkg 无法确保您拥有该项目实际使用的所有包。
这可能会觉得相当无聊。然而,如果您的包仓库中的所有依赖项都与 PyPI 上的名称相同,并且具有 Python 版本前缀(如 py35-setuptools),则需求映射是可选的。您只需使用以下方式创建包
python setup.py bdist_pkg --use-pypi-deps
专家使用
在专家模式下,您可能可以按照您喜欢的任何方式配置包生成。以下是您可以为 bdist_pkg 指定的完整选项列表
abi 和 arch:为包制作的 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_requires 和 extras_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。
项目详情
下载文件
下载适用于您平台文件的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。