I have a Bazel project that, depending on the runtime platform, requires a different version of a dependency. Each version of the dependency is bazel compatible, so I can use git_repository
- but you cant do things like use select
in repository rules. How would you do the equivalent of:
git_repository(
name = "my_library",
remote = "my_remote_location",
commit = select(
{
":value1":"sha-id-of-first-version",
":value2":"sha-id-of-second-version"
}
)
)
I have read that you can do something like grab both shas as seperate repos then use select like this:
...
deps = select({":value1":"@my_library_1//:...", "value2":"@my_library_2//:..."})
...
But I would really like to avoid having select statements like that sprinkled all across the BUILD.bazel files. There should be a way to assign to pick a version but apply the same repo name throughout - but I don't see how to do it, and my searches are turning up nothing.
I am currently stuck with WORKSPACE - if I could use bzlmod - there is probably a way to do this with repo extensions, etc.
Thanks in advance.
I have a Bazel project that, depending on the runtime platform, requires a different version of a dependency. Each version of the dependency is bazel compatible, so I can use git_repository
- but you cant do things like use select
in repository rules. How would you do the equivalent of:
git_repository(
name = "my_library",
remote = "my_remote_location",
commit = select(
{
":value1":"sha-id-of-first-version",
":value2":"sha-id-of-second-version"
}
)
)
I have read that you can do something like grab both shas as seperate repos then use select like this:
...
deps = select({":value1":"@my_library_1//:...", "value2":"@my_library_2//:..."})
...
But I would really like to avoid having select statements like that sprinkled all across the BUILD.bazel files. There should be a way to assign to pick a version but apply the same repo name throughout - but I don't see how to do it, and my searches are turning up nothing.
I am currently stuck with WORKSPACE - if I could use bzlmod - there is probably a way to do this with repo extensions, etc.
Thanks in advance.
Share Improve this question asked Feb 18 at 2:41 tenspd137 tenspd137 3931 silver badge13 bronze badges1 Answer
Reset to default 0You do need to define both possible external dependencies and choose at build time as you've already mentioned.
You do not need to make that choice at each place of consumption (deps
), you can define single alias
with the choice used for actual
attribute to decide and the alias' label where consumed.
There is one caveat to the example you've given though, you cannot alias to (actual
) wildcard labels. You could write an alias for each exposed target... and arguably well controlled dependency management would also do depend on specific targets as needed. Or if the type of dependency allowed it, one could use a label of some target that effectively aggregates the bits (e.g. filegroup
for generic files, or cc_library
via deps
for cc libraries).
For example a WORKSPACE
file with:
git_repository(
name = "my_library_var1",
remote = "my_remote_location",
commit = "sha-id-of-first-version",
)
git_repository(
name = "my_library_var2",
remote = "my_remote_location",
commit = "sha-id-of-second-version",
)
And then a BUILD
file:
alias (
name = "my_library",
actual = select(
{
"value1:": "@my_library_var1//:my_library",
"value2:": "@my_library_var2//:my_library",
},
),
visibility = ["//visibility:public"],
)
if e.g. under third_party/my_library/
Then for each consumer you could feed in:
...
deps = [
"//third_party/my_library",
],
...
For caveat in the second paragraph. If in your other repo you had two cc libraries: liba
and libb
, you could:
cc_library(
name = "my_library",
deps = ["liba", "libb"],
)
To use :my_library
(like in the above example) in case you want to depend on both through a single label.