首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何指定在Bazel中使用哪个Python工具链?

如何指定在Bazel中使用哪个Python工具链?
EN

Stack Overflow用户
提问于 2022-11-20 23:15:05
回答 1查看 48关注 0票数 0

我如何配置Bazel来选择一个工具链而不是另一个工具链?我可以通过命令行参数来定义要使用的工具链,或者指定应该在特定目标中使用的工具链。

当前在我的工作区文件中定义了两个工具链。我有两个Python工具链。其中一个从源代码构建Python,并将其包含在可执行的.zip输出中,而另一个则没有。

构建时,使用的工具链始终是注册的第一个工具链。在这种情况下,即使构建目标从python3_tooolchain导入requirement,也会使用hermetic_python3_toolchain

代码语言:javascript
复制
# WORKSPACE

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
load("@rules_python//python:pip.bzl", "pip_install")

http_archive(
    name = "rules_python",
    url = "https://github.com/bazelbuild/rules_python/releases/download/0.5.0/rules_python-0.5.0.tar.gz",
    sha256 = "cd6730ed53a002c56ce4e2f396ba3b3be262fd7cb68339f0377a45e8227fe332",
)

# Non-hermetic toolchain 
register_toolchains("//src:python3_toolchain")

pip_install(
   quiet = False,
   name = "python_dependencies",
   requirements = "//:requirements.txt",
   python_interpreter = "/usr/bin/python3"
)

load("@python_dependencies//:requirements.bzl", "requirement")




# Hermetic toolchain 

_py_configure = """
if [[ "$OSTYPE" == "darwin"* ]]; then
    ./configure --prefix=$(pwd)/bazel_install --with-openssl=$(brew --prefix openssl)
else
    ./configure --prefix=$(pwd)/bazel_install
fi
"""

http_archive(
    name = "hermetic_interpreter",
    urls = ["https://www.python.org/ftp/python/3.11.0/Python-3.11.0.tar.xz"],
    sha256 = "a57dc82d77358617ba65b9841cee1e3b441f386c3789ddc0676eca077f2951c3",
    strip_prefix = "Python-3.11.0",
    patch_cmds = [
        "mkdir $(pwd)/bazel_install",
        _py_configure,
        "make",
        "make install",
        "ln -s bazel_install/bin/python3 python_bin",
    ],
    build_file_content = """
exports_files(["python_bin"])
filegroup(
    name = "files",
    srcs = glob(["bazel_install/**"], exclude = ["**/* *"]),
    visibility = ["//visibility:public"],
)
""",
)

pip_install(
    name = "hermetic_python3_dependencies",
    requirements = "//:requirements.txt",
    python_interpreter_target = "@hermetic_interpreter//:python_bin",
)
load("@hermetic_python3_dependencies//:requirements.bzl", "requirement")




load("@rules_python//python:defs.bzl", "py_binary")
load("@rules_python//python:defs.bzl", "py_library")

register_toolchains("//src:hermetic_python3_toolchain")
代码语言:javascript
复制
# src/BUILD

load("@bazel_tools//tools/python:toolchain.bzl", "py_runtime_pair")

# Non-hermetic toolchain 
py_runtime(
    name = "python3_runtime",
    interpreter_path = "/usr/bin/python3",
    python_version = "PY3",
    visibility = ["//visibility:public"],
)

py_runtime_pair(
    name = "python3_runtime_pair",
    py2_runtime = None,
    py3_runtime = ":python3_runtime",
)

toolchain(
    name = "python3_toolchain",
    toolchain = ":python3_runtime_pair",
    toolchain_type = "@bazel_tools//tools/python:toolchain_type",
)

# Hermetic toolchain

py_runtime(
    name = "hermetic_python3_runtime",
    files = ["@hermetic_interpreter//:files"],
    interpreter = "@hermetic_interpreter//:python_bin",
    python_version = "PY3",
    visibility = ["//visibility:public"],
)

py_runtime_pair(
    name = "hermetic_python3_runtime_pair",
    py2_runtime = None,
    py3_runtime = ":hermetic_python3_runtime",
)

toolchain(
    name = "hermetic_python3_toolchain",
    toolchain = ":hermetic_python3_runtime_pair",
    toolchain_type = "@bazel_tools//tools/python:toolchain_type",
)


package(default_visibility = ["//visibility:public"])
代码语言:javascript
复制
# /src/some_tool/BUILD

load("@hermetic_python3_dependencies//:requirements.bzl", "requirement") # Can load this rule from either `hermetic_python3_dependencies` or `python3_dependencies`, but does not seem to make a difference 

py_binary(
    name = "some-tool",
    main = "some_tool.py",
    srcs = ["some_tool_file.py"],
    python_version = "PY3",
    srcs_version = "PY3",
    deps = [
        requirement("requests"),
        "//src/common/some-library:library",
    ]
)

package(default_visibility = ["//visibility:public"])
EN

回答 1

Stack Overflow用户

发布于 2022-12-03 10:50:34

考虑升级rules_python,因为该规则集包含自python/releases/tag/0.7.0以来的封闭python工具链。

如果这不是一种选择:

目前,您正在WORKSPACE.bazel文件中注册两个工具链,bazel将使用它的工具链分解来选择其中的一个。您可以使用--toolchain_resolution_debug=regex标志调试该分辨率,以查看发生了什么。

如果要强制整个构建使用其中一个工具链,请从WORKSPACE.bazel文件中删除注册工具链并创建一个.bazelrc

代码语言:javascript
复制
build:hermetic_python --extra_toolchains=//src:hermetic_python3_toolchain
build:system_python --extra_toolchains=//src:python3_toolchain

现在,您可以使用bazel build --config=hermetic_pythonbazel build --config=system_python在这些工具链之间切换。

但是,请注意,这并不影响用于运行pip_parse()的python工具链中的哪个。在加载requirement()函数时,您需要格外小心。只需通过load()函数,就可以强制对pip_parse()进行计算,并对相应的python解释器进行获取/编译。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74512774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档