将项目作为 PEX 文件分发的好处之一是您可以准备它在多个平台上运行。例如,一台PEX可以同时运行在Linux和Mac平台上。对于许多项目来说,除了构建 PEX 之外,没有什么特别要做的。但是,当您的项目依赖于特定于平台的二进制代码时,您将需要执行一些额外的步骤。
包含平台特定代码的库的一个示例是psutil
图书馆。它包含安装模块时编译到共享库中的 C 代码。要创建包含此类依赖项的 PEX 文件,您必须首先为除运行裤子的平台之外的所有平台提供该库的预构建版本。
预构建库的最简单方法是使用 pip 工具构建轮子。
本食谱假设如下:
- 您想要构建一个在 Linux 和 mac 上运行的多平台 pex
您将在 Linux 环境中预构建库,
然后在mac环境上搭建PEX。
- 您的项目目录位于 ~/src/cookbook 下
让我们使用一个引用库的简单程序并从中创建一个 pex。
# src/python/ps_example/main.py
import psutil
for proc in psutil.process_iter():
try:
pinfo = proc.as_dict(attrs=['pid', 'name'])
except psutil.NoSuchProcess:
pass
else:
print(pinfo)
使用 Pants,您可以通过在 BUILD 文件中定义 python_binary 目标来定义可执行文件:
# src/python/ps_example/BUILD
python_binary(name='ps_example',
source = 'main.py',
dependencies = [
':psutil', # defined in requirements.txt
],
)
# Defines targets from specifications in requirements.txt
python_requirements()
在同一目录中,在 requests.txt 文件中列出 python 库:
# src/python/ps_example/requirements.txt
psutil==3.1.1
现在,要制作多平台 pex,您需要访问 Linux 盒子来创建 Linux 版本的 psutil Wheel。将requirements.txt文件复制到linux机器上,然后执行pip工具:
linux $ mkdir ~/src/cookbook/wheelhouse
linux $ pip wheel -r src/python/multi-platform/requirements.txt \
--wheel-dir=~/src/cookbook/wheelhouse
这将创建一个特定于平台的轮文件。
linux $ ls ~/src/cookbook/wheelhouse/
psutil-3.1.1-cp27-none-linux_x86_64.whl
现在,您需要将特定于平台的轮子复制到要构建多平台 pex 的计算机(在本例中为您的 mac 笔记本电脑)。如果您定期使用此配方,您可能需要配置一个 Python 存储库来存储预构建的库。
我们将使用与上面相同的 BUILD 文件设置,但修改 python_binary 以指定platforms=
范围。
# src/python/ps_example/BUILD
python_binary(name='ps_example',
source = 'main.py',
dependencies = [
':psutil', # defined in requirements.txt
],
platforms=[
'linux-x86_64',
'macosx-10.7-x86_64',
],
)
# Defines targets from specifications in requirements.txt
python_requirements()
您还需要告诉 Pants 在哪里可以找到预构建的 Python 包。编辑pants.ini
并添加:
[python-repos]
repos: [
"%(buildroot)s/wheelhouse/"
]
现在,复制文件psutil-3.1.1-cp27-none-linux_x86_64.whl
转到 Mac 工作站并将其放置在名为的目录中wheelhouse/
在你的仓库的根目录下。
完成此操作后,您现在可以使用以下命令构建多平台 pex:
mac $ ./pants binary src/python/py_example
您可以通过解压缩 pex 来验证 Mac 和 Linux 的库是否包含在 pex 中:
mac $ unzip -l dist/ps_example.pex | grep psutil
17290 12-21-15 22:09 .deps/psutil-3.1.1-cp27-none-linux_x86_64.whl/psutil-3.1.1.dist-info/DESCRIPTION.rst
19671 12-21-15 22:09 .deps/psutil-3.1.1-cp27-none-linux_x86_64.whl/psutil-3.1.1.dist-info/METADATA
1340 12-21-15 22:09 .deps/psutil-3.1.1-cp27-none-linux_x86_64.whl/psutil-3.1.1.dist-info/RECORD
103 12-21-15 22:09
... .deps/psutil-3.1.1-cp27-none-macosx_10_11_intel.whl/psutil-3.1.1.dist-info/DESCRIPTION.rst
19671 12-21-15 22:09 .deps/psutil-3.1.1-cp27-none-macosx_10_11_intel.whl/psutil-3.1.1.dist-info/METADATA
1338 12-21-15 22:09 .deps/psutil-3.1.1-cp27-none-macosx_10_11_intel.whl/psutil-3.1.1.dist-info/RECORD
109 12-21-15 22:09
...