XAR打包工具链。
项目描述
XAR
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的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 15ebd62a2e885bf833f1ff60455e4f0de7d237359daf8617e459da5b09016757 |
|
MD5 | 9e6ae4e86c1eed27da1b46f7b5b92355 |
|
BLAKE2b-256 | 8ae6c5bbfaa0281005bfb2cf2c22f189191c1827d6dce2c65a3b94dda8b2aa32 |
xar-20.12.2-py2.py3-none-any.whl的哈希值
算法 | 散列摘要 | |
---|---|---|
SHA256 | 175d063081f82d7828743f45537e15515d935128690351083bfbc277484f5944 |
|
MD5 | 65ba6b91813c332c1ef750462bbaaac4 |
|
BLAKE2b-256 | 7fa0f050dd1be69dc7b1598f523df9bafc0f4c50d15257b45e7a87275ded9f33 |