You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从Meson迁移到Bazel:Python依赖对齐的工作流诉求及问题

解决Bazel结合uv管理Python依赖的工作流问题

背景

我们团队正从Meson迁移至Bazel,同时引入Python简化部署流程,要求开发者可直接从源码运行代码,仅需在合并前确认Bazel构建通过。尝试过rules_python与rules_uv但遇到阻碍:rules_uv仅完成pyproject.toml到requirements.txt的转换,无法获取供源码运行的uv.lock文件;自定义规则(在MODULE.bazel中执行uv export --format requirements-txt)虽能生成符合要求的requirements.txt,但更新依赖时必须执行bazel clean --expunge,效率低下。

期望工作流

  1. 开发者执行uv init初始化项目;
  2. 开发者通过uv add/uv remove等命令修改依赖,自动更新pyproject.toml与uv.lock;
  3. 本地生成的.venv可直接作为VS Code的Python解释器,支持源码运行;
  4. 执行bazel build //...或bazel run //<your-rule>时,Bazel自动基于uv.lock生成带精确哈希的requirements.txt,并完成依赖安装,确保Bazel与本地uv环境依赖一致。

解决方案

核心思路是让Bazel以uv.lock为可信输入,自动生成requirements.txt,同时保留开发者本地用uv管理虚拟环境的流程,无需手动清理Bazel缓存即可更新依赖。

1. 配置Git追踪与忽略

将pyproject.toml和uv.lock加入Git追踪,确保依赖变更可被版本控制;将自动生成的requirements.txt和.venv加入.gitignore,避免手动修改或提交冗余文件:

.venv/
requirements.txt

2. 自定义Genrule生成requirements.txt

在项目根目录的BUILD.bazel中添加genrule,以pyproject.toml和uv.lock为输入,执行uv export生成带哈希的requirements.txt。Bazel会自动检测输入文件的变更,触发重新生成,无需手动清理缓存:

genrule(
    name = "generate_requirements",
    srcs = ["pyproject.toml", "uv.lock"],
    outs = ["requirements.txt"],
    cmd = "uv export --format requirements-txt --locked --output $(OUTS)",
    toolchains = ["@rules_uv//uv:toolchain"],
)
  • --locked参数确保严格遵循uv.lock中的版本与哈希,保证Bazel依赖与本地uv环境完全一致;
  • 通过rules_uv的toolchain让Bazel获取uv工具,无需开发者手动配置环境变量。

3. 关联rules_python的pip依赖解析

在MODULE.bazel中加载rules_python的pip_parse,并依赖上述genrule生成的requirements.txt:

bazel_dep(name = "rules_python", version = "0.28.0")
bazel_dep(name = "rules_uv", version = "0.1.0")

load("@rules_python//python:pip.bzl", "pip_parse")

pip_parse(
    name = "pip_deps",
    requirements = "@//:generate_requirements",
)

load("@pip_deps//:requirements.bzl", "install_deps")
install_deps()

4. 开发者本地流程

  • 初始化项目:执行uv init生成pyproject.toml,随后执行uv sync生成.venv与uv.lock;
  • 修改依赖:使用uv add <package>或uv remove <package>,自动更新pyproject.toml与uv.lock;
  • 源码运行:将.venv/bin/python(或Windows下的.venv/Scripts/python.exe)配置为VS Code的Python解释器,直接运行代码;
  • Bazel构建:修改依赖后,直接执行bazel build //...,Bazel会自动检测uv.lock的变更,重新生成requirements.txt并安装依赖。

5. CI合并前检查

在CI流程中添加以下检查,确保依赖一致性与构建合法性:

  • 执行uv check验证pyproject.toml与uv.lock的一致性;
  • 执行bazel build //...确认Bazel构建正常通过。

内容的提问来源于stack exchange,提问作者Dani Lerner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 05:18:24