将软件从任何包管理器打包到任何发行版

upt的Python项目详细描述


通用包装工具(UPT)

一个统一的cli工具,它可以从特定于语言的包转换包 一个几乎可以免费使用的包的管理器(如pypi或npm) 基于Unix的操作系统(如GNU/Linux发行版或*BSD)。

安装

请注意,运行upt需要python 3.6或更新版本。

您可以从pypi安装upt:

$ pip install upt

您也可以从git存储库或tarball安装它:

$ python setup.py install

就其本身而言,upt是无用的。它需要前端和/或后端提供 有用的功能。请参阅此页末尾的可用前端/后端列表 文件。您可以通过运行以下命令安装它们:

$ pip install upt-pypi
$ pip install upt-openbsd
$ pip install ...

您也可以通过运行以下命令安装upt及其所有前端:

$ pip install upt[frontends]

您也可以通过运行以下命令安装upt及其所有后端:

$ pip install upt[backends]

您也可以通过运行以下命令安装upt及其所有前端和后端:

$ pip install upt[frontends,backends]

用法

您可以通过运行获得帮助:

$ upt --help

upt使用前端收集有关包的数据并编写包 使用后端定义。您可以列出所有已安装的前端和 运行的后端:

$ upt list-frontends
cpan
pypi
$ upt list-backends
guix
openbsd

将请求库打包到 Pypi用于GNU guix,只需写:

$ upt package --frontend pypi --backend guix requests

或者,使用较短的选项:

$ pip install upt
0

您还可以递归地打包它的所有要求:

$ pip install upt
1

包定义将写入标准输出。

发动机罩下

安装软件包的地方有两种:

  • 特定于语言的包存储库(cpan、cran、ctan、hackage、npm、pypi, rubygems等)
  • 传统的、与语言无关的包管理器(适用于debian,dnf适用于 fedora、nix、guix、pkgsrc、openbsd端口等)

前者提供的包通常也打包在后者中。 由于打包是一项单调而重复的任务,打包人员已经编写了工具 为了帮助他们这样做:guix有"guix导入",一个脚本集合 解析cpan、pypi和其他特定于语言的包存储库 生成一个guix包定义;debian有pypi2deb等工具, NPM2DEB…基于RPM的发行版和其他操作系统也是如此 系统:

我们来谈谈皮皮。似乎每个发行版都有 将拥有)一个解析pypi的工具。无论分配是什么(Debian, fedora,guix…,解析pypi基本上总是一样的:它只是 正在读取json文档。但此代码不在发行版之间共享, 这意味着他们最终都会写同样的代码。同样的道理 对于其他语言特定的包管理器。

特定于发行版的代码通常在不同的 所述分发提供的工具。编写openbsd端口总是涉及 创建一个目录,将维护者的名字写入makefile,等等。 操作对所有包都是通用的:它们不应该重写 openbsd开发人员最终可能会使用每一个工具。同样的道理 对于Debian:创建Debian包涉及很多操作 真正针对正在打包的软件。

我们还可以注意到,所有这些工具都有自己的接口:packagers 使用多个包存储库和/或多个分发版 因此,必须使用不同的界面来执行类似的任务。

通用打包工具(UPT)旨在为软件包维护人员提供 统一的cli,利用模块化基础架构的强大功能,旨在 尽可能多地分解代码。upt是项目的"核心"。它暴露 一个cli和一个小的python库,它定义了 包装。有两种物体与upt交谈:

  • 前端,解析包存储库并返回有关 使用UPT的内部表示的给定包;
  • 后端,将包的内部表示转换为有效的 语言不可知包管理器的包定义。

这基本上是其他常用工具所做的:gcc 编译器的前端用于语言,后端用于CPU 建筑。类似地,pandoc可以从 一种标记语言与另一种标记语言之间使用不同的前端和后端。

$ pip install upt
2

在这里,我们可以看到,使用upt pypi upt cpan的前端,upt能够 检索有关托管在cpan上的包的信息 pypi。然后,使用 upt guix后端,它可以生成 适合于gnu guix的包定义;使用 upt openbsd后端可以 生成适合于OpenBSD端口的生成文件。

使用这种模块化方法,我们解决了两个问题:

最后但并非最不重要的是,前端和后端不是upt核心项目的一部分。 每一个后端,每一个前端都是一个独立的项目 存储库,由其自己的团队编写。这样,没人能控制全部 项目,不同的社区可能会做出不同的技术选择(测试 工具、编码标准、版本控制系统……)无需强制 其他人都有。

对upt的贡献

您可以将补丁发送到tipecaml@gmail.com或打开一个pull 请求,

你的补丁不应该破坏任何东西,所以,在发送它们之前,一定要 运行:

$ pip install upt
3

您可能还希望为其中一个前端/后端做出贡献:它们是 单独的项目,所以您不应该将补丁发送到upt。

添加前端或后端

使用CookieCutter的新前端/后端

您可以使用 库克科特。这也会写 编写一些代码并创建第一个git提交,包括需要获得的所有内容 起动。只需键入:

$ pip install upt
4

回答屏幕上提示的问题。接下来的两部分描述 前端和后端的结构。

添加前端

setup.cfg应该使用一个入口点,如下所示:

$ pip install upt
5

或者,如果要使用setup.py:

$ pip install upt
6

现在让我们看看前端的实现:

$ pip install upt
7

这里最有趣的方法是myfrontendparser.parse。它必须返回 package对象(如果 希望)。只有包名及其版本必须传递给构造函数, 所有其他字段都是可选的。

添加后端

setup.cfg应该使用一个入口点,如下所示:

$ pip install upt
8

或者,如果要使用setup.py:

$ pip install upt
9

现在让我们看看后端:

$ python setup.py install
0

日志记录

无论是编写前端还是后端,都可以使用提供的记录器 通过upt运行:

$ python setup.py install
1

请参阅日志模块 文档了解有关 如何使用此记录器。

已知前端和后端

支持的前端

请告诉我们你的前端!

支持的后端

请告诉我们你的后端!

兼容性

<表><广告>< T/> UPT注册会计师 upt pypiupt rubygems< /广告><正文>UPT软呢帽 OK OK OK upt freebsd OK OK >k/td>UPT指南 OK OK OK UPT尼克斯 OK OK >k/td>upt openbsd OK OK OK

类似项目

通用工具

fpm(effing package management)是一个工具 与upt非常相似。它可以将pypi/rubygems/etc中的包转换成包 对于debian/fedora/etc,它具有一个统一的命令行接口 所有目标分布的行为,以及模块化设计。

与upt的主要区别在于它不生成 包,而不是可安装的包:它将生成一个deb文件,而不是 不是Debian/目录,而是RPM文件,而不是spec文件等。请参见 对错误的评论 跟踪器 了解更多信息。

每个分发工具

下面是一些用于将包从特定于语言的存档转换为 适合于通用包管理器的包。我们可以看到,gnu guix,netbsdopenbsd决定编写一个工具,因此 一个统一的cli来访问所有上游包。

<表><广告>< T/>德比安 软呢帽 guix免费bsd上网本打开bsd< /广告><正文>注册会计师dh使perlcpan2rpmguix导入?URL2PKGportgen npNPM2DEBnpm2rpm n/a?URL2PKG?PYPIPypi2debPYP2RPMguix导入pytoportURL2PKGportgen红宝石GEM2DEBGEM2RPMguix导入?URL2PKGportgen

许可证

此项目在3-clause bsd下分发 许可证。请参阅许可证文件。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
Java算法:如何对实体进行分组   C语言中的Java X509EncodedKeySpec#   如何修复java lambda筛选器(缺少返回语句)与future   java有没有办法在Swing中以亚像素精度绘制线条?   HV000030:找不到约束“javax”的验证器。验证。限制。大小为“验证类型”的java。util。可选<java。lang.String>'   CQL中语句的java分页状态   在开发时使用applet查看器的java对象相关applet   java如何从Oracle获取时区ID而不是时区偏移量   java递增变量   java JavaFX InvalizationListener或ChangeListener   java使用多个数据包将大量XMP数据插入jpg?   java允许删除请求   java为什么与类同名的方法不需要返回类型?   java数据转换错误转换   java一旦布尔值为真,如何关闭JFrame?   如何将数据写入两个java。木卫一。一次输出流对象?   mysql如何使用java在SQL中划分两列?   java使用Saxon/XQuery设置URI或目录解析器   mysql java。sql。SQLException:无法将值“20200816 17:33:21.690”从第18列转换为时间戳