如何使用BUCK创建独立的PEX(包括依赖项的PEX)文件?

时间:2019-04-19 12:58:22

标签: python buck

假设我具有以下项目结构:

├── BUCK
├── main.py
└── setup.py

位置:

main.py

from markdown import markdown

def joke():
    return markdown(u'Wenn ist das Nunst\u00fcck git und Slotermeyer?'
                    u'Ja! ... **Beiherhund** das Oder die Flipperwaldt '
                    u'gersput.')

print joke()

setup.py

import setuptools

setuptools.setup(
    name="packaging-hello-world",
    version="0.0.1",
    description="A hello world that attempts to package a Python project with its dependencies",
    packages=setuptools.find_packages(),
    include_package_data=True,
    install_requires=[
        'markdown',
    ],
)

降价

python_binary(
    name = 'bin_main',
    main_module = 'main',
    deps = [
        ':src_main',
    ],
    package_style = 'standalone',
    visibility = [
        'PUBLIC',
    ],
)

python_library(
    name = 'src_main',
    srcs = glob([
        '*.py',
    ]),
    visibility = [
        'PUBLIC',
    ],
)

markdown已安装在virtualenvironment中。

使用标准的pex工具,我可以做:pex . markdown -c main.py -o joke.pex,其中生成的joke.pex包含必需的依赖项(降价)。示例:unzip joke.pex -d tmp ; tree -a -I .bootstrap -L 2 tmp导致:

tmp
├── .bootstrap
│   ├── _pex
│   └── pex
├── .deps
│   ├── Markdown-3.1-py2.py3-none-any.whl
│   ├── packaging_hello_world-0.0.1-py2-none-any.whl
│   └── setuptools-41.0.0-py2.py3-none-any.whl
├── PEX-INFO
├── __main__.py
└── __main__.pyc

如何使BUCK生成的PEX(buck build :bin_main)也包含markdown?我尝试使用prebuilt_python_library指向从setup.py生成的转轮文件,并将其添加为bin_main的dep,但是,生成的PEX仍然不包含必需的dep。 / p>

1 个答案:

答案 0 :(得分:0)

您应该可以将其与prebuilt_python_library一起添加,但不要忘记将其作为deps添加到python_library内。

remote_file(
    name='markdown-download',
    url='https://files.pythonhosted.org/packages/c0/4e/fd492e91abdc2d2fcb70ef453064d980688762079397f779758e055f6575/Markdown-3.1.1-py2.py3-none-any.whl',
    sha1='b80598369cacd1f28b9746dd5469f2573e545178',
    out='Markdown-3.1.1-py2.py3-none-any.whl',
)

prebuilt_python_library(
    name='markdown',
    binary_src=':markdown-download',
    visibility=['PUBLIC'],
)

此方法的问题在于,您必须手动指定所有部门。 Markdown正在使用setuptools,因此您需要使用remote_file/prebuilt_python_library下载它。

我不知道这是否是最好的解决方案,但这对我有用。