bazel-contrib / bazel-contrib/rules_python

Create py_zipapp_binary to for building zip from py_binary

未关闭
#2,586 8 条评论 6 个 reaction 已指派 0 人 在 GitHub 查看
Good first issue
主要语言
Starlark
星标
688
派生
721
平均合并
15 小时 7 分钟
30 天内合并 PR
76

描述

Right now, py_binary has an implicit output (`{name}.zip}`) and output group (`python_zip_file`) that builds a zip file of the py_binary. This zip file is a "zipapp", basically a zip file with a top-level `__main__.py` file. See https://peps.python.org/pep-0441/ and https://docs.python.org/3/library/zipapp.html for details.

If the Bazel builtin flag `--build_python_zip` is set, then the zip output changes slightly: it is turned into a self-executable zip file by prepending some shell code to the zip file.

Having this part of py_binary itself is problematic for four main reasons:
1. It makes maintaining py_binary harder. The logic for creating the zip is subtle and introduces several branches on code that is otherwise straight forward.
2. A zipapp is just one of many ways to create a "distributable" py_binary. It doesn't make sense to bake one directly into py_binary.
3. A zipapp only works if it's pure-python code. If there are C library dependencies, then the zip _must_ be extracted, which then breaks the logic for handling zipapp-based startup.
4. A zip file doesn't have native support for symlinks. This makes it incompatible with bootstrap=script and how it creates a venv with symlinks to the desired python interpreter. Working around this requires hacks being applied at runtime with their own problems.

What to do:

* [x] Create a `py_zipapp_binary` and `py_zipapp_test` rule. As input, they take a py_binary As output, they produce a zipapp. An attribute decides if its executable or not.
* [x] As part of the above: create a tool to generate zip files that contain symlinks. Use `File.is_symlink` to detect if inputs should be symlinks or not. For a python-based implementation, how to create a symlink: https://stackoverflow.com/questions/35782941/archiving-symlinks-with-python-zipfile . It doesn't necessairily have to be implemented in Python. Another language is fine, however, if it's a compiled language, then we'll need to update rules_python handle building and consuming prebuilt artifacts.
* [x] Add windows support to py_zipapp_binary et al
* [x] Add python_zip_file output group to py_zipapp for compatibility
* [x] Add deprecation warning for py_binary zipapp usage
* [x] Add entries to features.bzl
* [x] Default windows to non-zip builds
* [ ] Disable and remove the `--build_python_zip` flag and `python_zip_file` output group.

I'll note that there are rule sets, e.g. rules_pkg that support somewhat arbitrary creation of zip files. Using one of those would also be fine.

贡献指南

打开贡献指南

调研方向

首先,在仓库中定位剩余的 --build_python_zip 标志和 python_zip_file 输出组引用。检查现有的 py_zipapp_binary 和 py_zipapp_test 实现及其兼容性条目,然后验证移除旧接口后,文档中描述的 zipapp 行为和测试仍然完整。

由索引模型根据 Issue 内容生成。

评估

技术栈
python
领域
build-system, tooling
Issue 类型
功能
难度
4/5
预计耗时
3-5 天
活跃度
冷清
描述清晰度
基本清楚
新手友好度
35/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。