跳转到主要内容

PyPI 到 PKGBUILD 转换器。

项目描述

PyPI

pip2arch 启发,将 PyPI 软件包转换为 Arch Linux 软件包。

处理所有尺寸的软件包,从最简单的(纯 Python,无依赖项)到最复杂的(C 级依赖项,外部 C 库等,例如大多数科学 Python 堆栈,或 PyGObject 和 wxPython 等图形用户界面工具包) [1]

依赖项和安装

pypi2pkgbuild.py 依赖于 Arch Linux 软件包 namcappkgfilepython-pip [2]

可以使用 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末尾 被源文件。为了便于修补,buildpackage 以及在适用的情况下 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文件,尝试猜测是否需要将CythonSWIG作为构建时的依赖项。如果不需要这样做,可以相应地设置--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)'
  )

与其他工具的比较

其他类似的工具包括pip2archpip2pkgbuildfpm。据我所知,以下功能是PyPI2PKGBUILD独有的;如果这是错误的,请让我知道。

  • 支持轮子(默认优先使用任何平台的轮子,然后是sdist,然后是manylinux1轮子,但可以通过--pkgtypes进行更改)。

  • 通过在临时虚拟环境中安装来解析Python依赖项,并为那些作为官方包不可用的依赖项创建PKGBUILD。

  • 通过namcap解析二进制依赖项,并将已安装的依赖项添加到depends数组中(因此建议首先以--asdeps安装它们,然后让生成的PKGBUILD将其作为依赖项选择)。请注意,一些包附带所需库的副本;在这种情况下,pypi2pkgbuild.py的行为将取决于包是否默认使用系统库或其自己的副本。

  • 如果适用,自动尝试从GitHub获取缺失的许可文件。

  • 自动构建包(使用--makepkg=...中给出的选项)并运行namcap。

  • 自动通过-u选项构建所有过时的依赖项。

项目详情


下载文件

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

源分布

pypi2pkgbuild-0.3.tar.gz (30.2 kB 查看哈希)

由以下组织支持