PyPI 到 PKGBUILD 转换器。
项目描述
受 pip2arch 启发,将 PyPI 软件包转换为 Arch Linux 软件包。
处理所有尺寸的软件包,从最简单的(纯 Python,无依赖项)到最复杂的(C 级依赖项,外部 C 库等,例如大多数科学 Python 堆栈,或 PyGObject 和 wxPython 等图形用户界面工具包) [1]。
依赖项和安装
pypi2pkgbuild.py 依赖于 Arch Linux 软件包 namcap,pkgfile 和 python-pip [2]。
官方支持 pacman 和 pip 的最新版本。实际上,我所知的硬性要求是 pacman≥5.1(改变了 makepkg --printsrcinfo 的行为)和 pip≥10(改变了 pip --list 的默认格式)。
可以使用 pip install [--user] . 安装脚本,或者也可以直接运行。
甚至可以在 pypi2pkgbuild.py 上运行 pypi2pkgbuild.py 以创建合适的 Arch 软件包(pypi2pkgbuild.py git+https://github.com/anntzer/pypi2pkgbuild)。
一个最小的测试套件(检查 pypi2pkgbuild.py 是否能够打包自身)可以通过 pytest≥3.9 运行(使用 pytest -s 保持输出在终端中)。
用法
pypi2pkgbuild.py PYPINAME 会为指定的 PyPI 包的最新版本和当前 Python 解释器版本(仅限 Python 3)创建一个 PKGBUILD 文件。如果传递了 --pre 标志,则会考虑预发布版本。由于 PyPI 的依赖信息有些不可靠,它会在一个虚拟环境中安装包来找出依赖关系。请注意,由于 pip 的 wheel 缓存,构建过程可以稍后重用;也就是说,这个过程涉及的工作非常少。
可以使用 pypi2pkgbuild.py git+https://... 构建带有 -git 的包。
然后使用 namcap 构建并验证该包。
目标是尽可能使此工具自动化:如果构建包所需的所有信息(合理地)都可用,则此工具应该能够构建它。
为了向 makepkg 提供更多信息,编辑 PKGBUILD_EXTRAS(也可以使用 --pkgbuild-extras 标志完成)。此文件在 PKGBUILD 的 末尾 被源文件。为了便于修补,build、package 以及在适用的情况下 pkgver 函数通过转发到 _build、_package 和 _pkgver 来定义。还有一个 _check 函数,但未使用(由于缺乏标准测试 CLI)。PKGBUILD_EXTRAS 的几个有用示例列在 pkgbuild-extras 目录中。
使用说明
建议创建一个具有标准选项的别名,例如:
alias pypi2pkgbuild.py='PKGEXT=.pkg.tar pypi2pkgbuild.py -g cython -b /tmp/pypi2pkgbuild/ -f'
默认情况下,(标准) 包的 pkgrel 被设置为 00。这允许在仓库更新时自动升级到官方包(以及 AUR 包,如果使用了 AUR 辅助工具)。此外,使用 00 而不是 0 作为标记,表明该包是由此工具自动生成的。为了防止此类升级,可以使用 --pkgrel 标志将 pkgrel 设置为,例如,99。
如果希望在保持使用 AUR 辅助工具来处理非 Python 包的同时完全绕过 AUR Python 包,可以定义一个 shell 函数来排除在官方仓库中不存在的 pypi2pkgbuild.py 生成的包,例如,对于 pacaur。
pacaur() { if [[ "$1" = "-Syu" ]]; then # Update, in case some packages moved in or out of the official repos. sudo pacman -Sy # Upgrade everything except python packages with pkgver=00 or 99. PKGEXT=.pkg.tar command pacaur -Su --ignore \ "$(pacman -Qm | grep '^python-.*-\(00\|99\)$' | cut -d' ' -f1 | paste -sd,)" else command pacaur "$@" fi }
此函数不会绕过显式从 AUR 安装的 Python 包,因为用户可能已经这样做来绕过 pypi2pkgbuild.py 的某些错误打包。建议在调用 pypi2pkgbuild.py 的过程中使用 -i 标志(例如,在别名中)来排除 pypi2pkgbuild.py 处理不当的包(请参阅 错误打包的包)。-i 标志可以多次传递;传递空参数给它将清除到目前为止定义的忽略列表。
要打包本地可用的 git 仓库,请使用:
$ pypi2pkgbuild.py git+file://$absolute_path_to_repo # (e.g. file:///home/...)
要打包本地可用的 sdist 或 wheel,请使用:
$ pypi2pkgbuild.py file://$absolute_path_to_file # (e.g. file:///home/...)
请注意,在这两种情况下都需要 绝对 路径。
从本地仓库或wheel文件构建包时,需要按照依赖关系的拓扑顺序进行(这样pypi2pkgbuild.py才能找到实际存在的依赖),或者通过传递-d标志(“不构建依赖”);如果使用了该标志,Arch包可能不会使用正确的依赖项名称(如果它们不是python-pep503-normalized-name的形式)。
默认情况下,pypi2pkgbuild.py会忽略如~/.config/pip/pip.conf之类的pip配置文件。如果显式设置了PIP_CONFIG_FILE,则将予以尊重,但可能会导致pypi2pkgbuild.py失败,因为某些pip调用可能会意外地被修改。
同样,除非显式地将PYTHONNOUSERSITE设置为空值,否则会忽略用户-site包。
软件包的构建时依赖项
pypi2pkgbuild.py通过检查是否存在.pyx和.i文件,尝试猜测是否需要将Cython和SWIG作为构建时的依赖项。如果不需要这样做,可以相应地设置--guess-makedepends选项。
pypi2pkgbuild.py通过尝试不带numpy的构建,然后在构建失败的情况下,使用numpy进行构建,来猜测是否需要将numpy作为构建时的依赖项。
可以使用--setup-requires标志指定额外的Python构建时依赖项(即setup_requires),或者使用--pkgbuild-extras作为常规条目(它们将被安装到构建虚拟环境中)。
可以使用--pkgbuild-extras将额外的非Python构建时依赖项设置为makedepends;它们将在pypi2pkgbuild.py尝试为该包构建wheel之前安装。
供应商软件包
一些Arch包(例如ipython)包括大量的较小的PyPI包。
由于无法自动分配有意义的版本,pypi2pkgbuild.py因此为每个PyPI包创建一个独立的Arch包(包名中包含两个短横线,以防止名称冲突)和一个主包,该主包依赖于所有这些包。主包的pkgrel被设置为$official_pkgrel.99,这样包看起来比当前官方版本更新,但比任何未来的官方版本都要旧。所有这些包都与其他所有版本的官方包(除新创建的包外)冲突,因此当官方包实际上更新时,升级应该运行良好。
但是,依赖项仍然使用主包(以避免在升级到官方包时损坏)表示,因此内部依赖项将显示为循环。
所有包都放置在一个名为meta:$pkgname的子文件夹中,因此可以通过cd到那里并运行来轻松安装所有内容
$ sudo pacman -U --asdeps **/*.xz
$ sudo pacman -D --asexplicit $pkgname/$pkgname.tar.xz
处理 Python 升级
当Python次要版本(3.x中的x)升级时,需要重新生成所有自建的包。这可以通过例如以下方式完成
$ pypi2pkgbuild.py $(
ls /usr/lib/python3.$oldver/site-packages |
grep -Po '.*(?=-.*.dist-info)'
)
与其他工具的比较
其他类似的工具包括pip2arch,pip2pkgbuild和fpm。据我所知,以下功能是PyPI2PKGBUILD独有的;如果这是错误的,请让我知道。
支持轮子(默认优先使用任何平台的轮子,然后是sdist,然后是manylinux1轮子,但可以通过--pkgtypes进行更改)。
通过在临时虚拟环境中安装来解析Python依赖项,并为那些作为官方包不可用的依赖项创建PKGBUILD。
通过namcap解析二进制依赖项,并将已安装的依赖项添加到depends数组中(因此建议首先以--asdeps安装它们,然后让生成的PKGBUILD将其作为依赖项选择)。请注意,一些包附带所需库的副本;在这种情况下,pypi2pkgbuild.py的行为将取决于包是否默认使用系统库或其自己的副本。
如果适用,自动尝试从GitHub获取缺失的许可文件。
自动构建包(使用--makepkg=...中给出的选项)并运行namcap。
自动通过-u选项构建所有过时的依赖项。
项目详情
pypi2pkgbuild-0.3.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | eae7aa06c2a05175d5e6a37b91fc07d728a3d788c210af9028ecffb18b69fcdd |
|
MD5 | c5a97c461827ff5e98d91c64c2bbdde6 |
|
BLAKE2b-256 | 3cd7f2eb113bab3a9452d0d8da3047a4761a16b19cdb58ad60de74b42ed14c2f |