如何用BUCK生成包含markdown依赖的独立PEX文件?
解决Buck生成PEX时缺失第三方依赖(Markdown)的问题
我看到你遇到了Buck打包Python项目时,生成的PEX不包含Markdown依赖的问题,结合你的项目场景,我来给你梳理下正确的配置方式:
项目结构
├── 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', ], )
初始BUCK配置
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'], )
你提到用标准pex工具执行pex . markdown -c main.py -o joke.pex能正常生成包含Markdown依赖的PEX,解压后结构如下:
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
但尝试用prebuilt_python_library指向setup.py生成的wheel作为依赖时,生成的PEX还是没包含Markdown。问题出在Buck的依赖声明方式上——prebuilt_python_library更适合本地预构建的自定义wheel,而PyPI上的第三方包需要用python_requirement来声明。
正确的BUCK配置方案
修改你的BUCK文件,添加python_requirement来声明Markdown依赖,并把它加到项目库的依赖链中:
# 声明PyPI上的Markdown依赖,版本和setup.py保持一致 python_requirement( name = 'markdown', requirement = 'markdown==3.1', visibility = ['PUBLIC'], ) python_library( name = 'src_main', srcs = glob(['*.py']), deps = [':markdown'], # 让项目代码依赖Markdown包 visibility = ['PUBLIC'], ) python_binary( name = 'bin_main', main_module = 'main', deps = [':src_main'], package_style = 'standalone', visibility = ['PUBLIC'], )
配置原理说明
python_requirement规则会让Buck自动从PyPI拉取指定版本的Markdown包,处理依赖解析和下载。- 将Markdown依赖添加到
src_main的deps中,这样python_binary在打包时会递归收集所有依赖,包括第三方包,最终打包进PEX。 package_style = 'standalone'确保生成的PEX是独立可执行的,不需要额外安装依赖就能运行。
验证方法
- 执行
buck build :bin_main,生成的PEX文件在buck-out/gen/bin_main.pex路径下。 - 运行该PEX:
./buck-out/gen/bin_main.pex,应该能正常输出渲染后的Markdown内容。 - 解压PEX查看内部结构,会在
.deps目录下看到Markdown的wheel文件,和pex工具生成的结构一致。
内容的提问来源于stack exchange,提问作者E. Fernandes
相关产品推荐
相关产品推荐

