我有一个项目,我想在其中构建 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
文件中创建条件,但也许可以通过其他方式实现?
一般来说,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 目标时都必须记住设置此值。