Skip to content

Commit 45919ea

Browse files
committed
Alias workspace members from crate hubs
1 parent e8f3393 commit 45919ea

15 files changed

Lines changed: 518 additions & 2 deletions

File tree

rs/extensions.bzl

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ load(
1515
"split_lockfile_packages",
1616
"workspace_dep_data",
1717
_fq_crate = "fq_crate",
18+
_manifest_package_dir = "manifest_package_dir",
1819
_normalize_path = "normalize_path",
1920
_select = "select_items",
2021
)
@@ -416,6 +417,12 @@ crate.annotation(
416417
_fq_crate(package["name"], package["version"]): package
417418
for package in packages
418419
}
420+
workspace_member_by_fq = {
421+
_fq_crate(package["name"], package["version"]): package
422+
for package in cargo_metadata["packages"]
423+
}
424+
repo_root = _normalize_path(cargo_metadata["workspace_root"])
425+
workspace_package = _label_directory(cargo_lock_path)
419426

420427
hub_contents = []
421428
for name, versions in versions_by_name.items():
@@ -478,6 +485,35 @@ alias(
478485
default_version = default_version,
479486
))
480487

488+
workspace_member_hub_aliases = {}
489+
hub_label_prefix = "@%s//:" % hub_name
490+
for package in packages:
491+
feature_resolutions = package["feature_resolutions"]
492+
for deps_by_triple in [feature_resolutions.deps, feature_resolutions.build_deps]:
493+
for deps in deps_by_triple.values():
494+
for bazel_target in deps:
495+
if not bazel_target.startswith(hub_label_prefix):
496+
continue
497+
498+
fq = bazel_target.removeprefix(hub_label_prefix)
499+
workspace_member = workspace_member_by_fq.get(fq)
500+
if workspace_member:
501+
workspace_member_hub_aliases[fq] = workspace_member
502+
503+
for fq in sorted(workspace_member_hub_aliases.keys()):
504+
package = workspace_member_hub_aliases[fq]
505+
package_dir = _manifest_package_dir(package["manifest_path"], repo_root)
506+
bazel_package = paths.join(workspace_package, package_dir).removesuffix("/")
507+
hub_contents.append("""
508+
alias(
509+
name = "{name}-{version}",
510+
actual = "@@//{bazel_package}",
511+
)""".format(
512+
name = package["name"],
513+
version = package["version"],
514+
bazel_package = bazel_package,
515+
))
516+
481517
workspace_deps, conditional_workspace_deps = render_select(
482518
[],
483519
workspace_dep_labels_by_triple,
@@ -577,8 +613,6 @@ RESOLVED_PLATFORMS = select({{
577613

578614
_date(mctx, "done")
579615

580-
repo_root = _normalize_path(cargo_metadata["workspace_root"])
581-
workspace_package = _label_directory(cargo_lock_path)
582616
data_bzl_contents = render_dep_data(workspace_dep_data(
583617
cargo_metadata = cargo_metadata,
584618
feature_resolutions_by_fq_crate = feature_resolutions_by_fq_crate,

test/BUILD.bazel

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,23 @@ genquery(
171171
scope = ["@workspace_member_annotation_features//:dep_leaf-0.1.0"],
172172
)
173173

174+
genquery(
175+
name = "vendored_workspace_dep_itoa_deps",
176+
expression = "deps(@vendored_workspace_dep//:itoa-1.0.11)",
177+
scope = ["@vendored_workspace_dep//:itoa-1.0.11"],
178+
)
179+
180+
genrule(
181+
name = "verify_vendored_workspace_dep",
182+
srcs = [":vendored_workspace_dep_itoa_deps"],
183+
outs = ["verify_vendored_workspace_dep.txt"],
184+
cmd = """
185+
grep 'vendored_workspace_dep//:mylib-0.1.0' $(location :vendored_workspace_dep_itoa_deps)
186+
grep '//vendored_workspace_dep/mylib:mylib' $(location :vendored_workspace_dep_itoa_deps)
187+
echo ok > $@
188+
""",
189+
)
190+
174191
verify_alias(
175192
name = "verify_workspace_hyphen_dep_aliases",
176193
aliases = workspace_hyphen_dep_aliases_aliases(package_name = "workspace_hyphen_dep_aliases/consumer"),
@@ -305,6 +322,7 @@ filegroup(
305322
":verify_workspace_default_features_subfeature_present",
306323
":verify_workspace_hyphen_dep_aliases",
307324
":verify_workspace_member_annotation_features",
325+
":verify_vendored_workspace_dep",
308326
":verify_workspace_renamed_path_dep_aliases",
309327
"//prost:echo_rust_proto",
310328
"//self_dev_dependency/mycrate",

test/MODULE.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ TESTS = [
148148
"target_workspace_dep_feature",
149149
"vendored_crate_override",
150150
"workspace_default_features",
151+
"vendored_workspace_dep",
151152
"workspace_member_annotation_features",
152153
"workspace_git_dep",
153154
"workspace_path_dependency",

test/MODULE.bazel.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
package(default_visibility = ["//visibility:public"])

test/vendored_workspace_dep/Cargo.lock

Lines changed: 21 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
[workspace]
2+
members = ["mylib", "app"]
3+
exclude = ["vendor/itoa"]
4+
resolver = "3"
5+
6+
[workspace.dependencies]
7+
mylib = { path = "./mylib" }
8+
itoa = { path = "./vendor/itoa" }
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
[package]
2+
name = "vendored_workspace_dep_demo"
3+
version = "0.1.0"
4+
edition = "2024"
5+
6+
[dependencies]
7+
itoa = { workspace = true }
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
fn main() {
2+
let mut buffer = itoa::Buffer::new();
3+
let formatted = buffer.format(42);
4+
println!("vendored itoa says: {formatted}");
5+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
load("@rules_rs//rs:rust_library.bzl", "rust_library")
2+
3+
package(default_visibility = ["//visibility:public"])
4+
5+
rust_library(
6+
name = "mylib",
7+
srcs = ["src/lib.rs"],
8+
edition = "2024",
9+
)

0 commit comments

Comments
 (0)