BAZEL 是否可以根据我构建的目标下载不同的外部依赖项?

问题描述 投票:0回答:1

我有一个项目,我想在其中构建 android 和非 android 目标。我的

WORSPACE.bazel
文件定义了android相关的依赖项。

android_sdk_repository(
    name = "androidsdk",
    api_level = 33,

)
http_archive(
    name = "rules_android_ndk",
    ....
)
load("@rules_android_ndk//:rules.bzl", "android_ndk_repository")
android_ndk_repository(
    name = "androidndk",
    api_level = 33,
)
register_toolchains("@androidndk//:all")

问题是上面的代码需要将 Android 的 SDK/NDK 下载到我的计算机上,无论我想构建哪个目标。

我不希望其他开发人员(从事该项目但不在 Android 目标上工作的人)必须下载 Android SDK。

根据构建目标,是否有任何更好的方法可以跳过使用某些依赖项? 我知道我无法在

WORKSPACE
文件中创建条件,但也许可以通过其他方式实现?

android sdk bazel bazel-rules
1个回答
0
投票

一般来说,Bazel 只查看构建所请求的内容所需的内容,因此通常如果没有请求任何与 Android 相关的内容,则不应加载

android_sdk_repository
android_ndk_repository
存储库规则。但是,随着向工具链的过渡,使用
register_toolchains()
将导致加载该存储库。因此
register_toolchains("@androidndk//:all")
将导致 ndk 被加载,Starlark 版本的
android_sdk_repository
类似: https://github.com/bazelbuild/rules_android/blob/6cd2cbb345eff9c94462498501d83cf700357113/examples/basicapp/WORKSPACE#L39-L42

android_sdk_repository
(Starlark 和本机)的解决方法是生成一个空的工具链,如果最终实际使用它,则会产生错误(例如 https://github.com/bazelbuild/rules_android/blob/ 6cd2cbb345eff9c94462498501d83cf700357113/rules/android_sdk_repository/empty.template.bzl#L56-L66

但是,如果未设置

android_ndk_repository
(问题中使用的 starlark 版本),则尚未生成空工具链。但有一个正在进行的更改要添加:
https://github.com/bazelbuild/rules_android_ndk/pull/63
临时解决方法是删除

ANDROID_NDK_HOME

并在命令行上使用

register_toolchains()
注册工具链(也可以将其放入
--extra_toolchains
中,如
.bazelrc
然后在命令上使用
build:android --extra_toolchains=@androidndk//:all
)线)。缺点是每次构建 Android 目标时都必须记住设置此值。
    

© www.soinside.com 2019 - 2024. All rights reserved.