跳转到主要内容

XAR打包工具链。

项目描述

XAR

CircleCI Status Code style: black Downloads

XAR允许您将多个文件打包成一个单一的、自包含的可执行文件。这使得分发和安装变得容易。

一个 .xar 文件是一个只读的文件系统镜像,当挂载时,对用户空间程序来说就像一个常规目录。这需要为这个文件系统(SquashFS)安装一次驱动程序。

XAR 读作“沙尔” (/t͡ʂar/)。XAR 中的 'X' 是为了代替所有其他字母,因为在 Facebook,这个格式最初是为了替代基于 ZIP 的 PAR(Python 归档)、JSAR(JavaScript 归档)、LAR(Lua 归档)等而设计的。

用例

XAR 文件有两个主要用例。第一个是简单地将多个文件收集起来,以便在文件系统中的某个位置自动、原子性地挂载。使用 XAR 文件可以极大地缩小它所保存数据的磁盘大小。压缩到原始大小的 20% 以下并不罕见。这可以每个机器节省多个吉字节,并减少随机磁盘 I/O。这对使用闪存存储的机器尤为重要。

第二个用例是第一个用例的扩展——通过将 XAR 文件设置为可执行文件并使用 xarexec 助手,XAR 变成了一个包含可执行代码及其数据的自包含包。一个流行的例子是包含所有 Python 源代码文件、本地共享库、配置文件和其他数据的 Python 应用程序归档。

这可以替代虚拟环境和使用 PEX 文件,它具有更快的速度、更低的开销、更高的兼容性,并实现了更好的压缩。缺点是它需要一个 setuid 助手来执行挂载操作。

XAR 在 Python 中的优势

  • SquashFS 在磁盘上看起来像常规文件,这使得它可以使用更好的 CPython 支持的常规导入。

  • SquashFS 对您的应用程序来说也像常规文件。您不需要使用 pkg_resources 或其他技巧来访问包中的数据文件。

  • 使用 Zstandard 压缩的 SquashFS 与 ZIP 文件相比可以节省磁盘空间。

  • SquashFS 不需要像 ZIP 文件那样将 .so 文件解压缩到临时位置。

  • SquashFS 启动速度比解压缩 ZIP 文件快。您只需要挂载一次文件系统。随后的应用程序调用将重用现有的挂载。

  • SquashFS 只解压缩应用程序使用的页面,并且解压缩的页面会缓存在页面缓存中。

  • SquashFS 是只读的,因此与使用虚拟环境或解压缩到临时目录相比,可以保证应用程序的完整性。

基准测试

优化性能(空间和执行时间)是 XAR 的关键设计目标。我们使用开源工具进行了基准测试,比较了 PEX、XAR 和本地安装的以下指标

  • 大小:可执行文件的字节数
  • 冷启动时间:没有挂载或提取时的时间
  • 热启动时间:提取缓存或挂载 XAR squashfs 时的时间

PEXs 使用 python3 setup.py bdist_pex --bdist-all 构建,而 XARs 使用 python3 setup.py bdist_xar --xar-compression-algorithm=zstd 构建。

控制台脚本 大小 冷启动时间 热启动时间
django-admin (本地) 22851072 B - 0.220 s
django-admin.pex 8529089 B 1.705 s 0.772 s
django-admin.xar 5464064 B (-36%) 0.141 s (-92%) 0.122 s (-84%)
black (本地) 1020928 B - 0.245 s
black.pex 677550 B 0.737 s 0.619 s
black.xar 307200 B (-55%) 0.245 s (-67%) 0.219 s (-65%)
jupyter (本地) 64197120 B - 0.399 s
jupyter.pex 17315669 B 2.152 s 1.046 s
jupyter.xar 17530880 B (+1%) 0.213 s (-90%) 0.181 s (-83%)

结果显示,使用XARs(包括zstd压缩的文件大小)和启动时间都得到了改善。这对于向大量服务器发货是一个改进,尤其是在短运行的可执行文件中,例如Web服务器上的小型数据收集脚本或交互式命令行工具。

需求

XAR需要

  • Linux或macOS
  • Python >= 2.7.11 & >= 3.5
  • squashfs-tools来构建XARs
  • squashfuse >= 0.1.102 以及 squashfuse_ll来运行XARs

XAR组件

bdist_xar

这是一个setuptools插件,允许您将Python应用程序打包为.xar文件。它需要squashfs-tools。从PyPI安装它以获取稳定版本

pip install xar

或者您可以从此存储库安装它

python setup.py install

安装后,转到您的Python项目,该项目具有控制台脚本,并运行

python setup.py bdist_xar

setuptools扩展bdist_xar具有配置XAR的选项,最重要的是--interpreter设置了Python解释器。运行python setup.py bdist_xar --help以获取选项的完整列表。

xarexec_fuse

这是一个用C++编写的二进制文件,用于挂载SquashFS镜像。它需要安装squashfuse。请注意,当前Ubuntu上的squashfuse包不包括squashfuse_ll,因此您需要从安装。

您可以使用以下命令构建此代码部分

mkdir build && cd build && cmake .. && make && [sudo] make install

示例

bdist_xar

简单运行

python /path/to/black/setup.py bdist_xar [--xar-compression-algorithm=zstd]
/path/to/black/dist/black.xar --help

make_xar

XAR提供了一个简单的CLI,可以从Python可执行文件或目录创建XAR。我们可以从现有的Python可执行文件zip文件创建XAR,如PEX。

make_xar --python black.pex --output black.xar

您还可以从目录创建XAR,并告诉XAR启动后要运行哪个可执行文件。

> mkdir myxar
> echo -n "#\!/bin/sh\nshift\necho \$@" > myxar/echo
> chmod +x myxar/echo
> make_xar --raw myxar --raw-executable echo --output echo
> ./echo hello world
hello world

xarexec_fuse将使用XAR路径作为第一个参数执行给定的可执行文件,并将XAR的参数转发之后。

在本地运行Circle CI测试

首先您需要安装docker(以及可能的docker-machine),因为它是运行代码的方式。然后您需要安装 circleci cli,并运行

circleci build

如果您更改.circleci/config.yml,请在提交之前进行验证

circleci config validate

贡献

有关如何帮助的详细信息,请参阅CONTRIBUTING文件。

许可

XAR是BSD许可。

项目详情


下载文件

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

源分布

xar-20.12.2.tar.gz (66.8 kB 查看散列)

上传时间

构建分布

xar-20.12.2-py2.py3-none-any.whl (74.4 kB 查看散列)

上传时间 Python 2 Python 3

由以下支持