Skip to content

Commit cf3778f

Browse files
committed
Improve handling of extra aliased targets for workspace-member dependencies and add tests for external dependencies
Signed-off-by: Thomas Lam <thomaslam@canva.com>
1 parent 5ec9c16 commit cf3778f

1 file changed

Lines changed: 94 additions & 16 deletions

File tree

crate_universe/src/rendering.rs

Lines changed: 94 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -209,15 +209,15 @@ impl Renderer {
209209
.as_ref()
210210
.unwrap_or(&self.config.default_alias_rule);
211211

212+
let is_workspace_member = context.workspace_members.contains_key(&dep.id);
212213
if let Some(library_target_name) = &krate.library_target_name {
213214
// Workspace-member deps have no spoke repo
214215
// (@{index}__<name>-<version>): extensions.bzl skips spoke
215216
// creation when crate["repository"] == None
216217
// (crate_universe/extensions.bzl:722-724). Use
217218
// override_targets[key] when set; skip otherwise to avoid
218219
// emitting dangling alias targets.
219-
let maybe_actual: Option<Label> = if context.workspace_members.contains_key(&dep.id)
220-
{
220+
let maybe_actual: Option<Label> = if is_workspace_member {
221221
krate.targets.iter().find_map(|rule| match rule {
222222
Rule::Library(..) | Rule::ProcMacro(..) => krate
223223
.override_targets
@@ -233,11 +233,12 @@ impl Renderer {
233233
))
234234
};
235235

236-
if context.workspace_members.contains_key(&dep.id) && maybe_actual.is_none() {
236+
if is_workspace_member && maybe_actual.is_none() {
237237
tracing::warn!(
238238
"Skipping hub alias for workspace-member dep `{}-{}`: \
239239
no override_targets entry found. Add \
240-
`crate.annotation(override_target_lib = \"...\")` in MODULE.bazel \
240+
`crate.annotation(override_target_lib = \"...\")` (or \
241+
`override_target_proc_macro` for proc-macro crates) in MODULE.bazel \
241242
to emit a hub alias.",
242243
krate.name,
243244
krate.version,
@@ -296,23 +297,24 @@ impl Renderer {
296297
}
297298
}
298299

299-
for (alias, target) in &krate.extra_aliased_targets {
300-
if context.workspace_members.contains_key(&dep.id) {
300+
if is_workspace_member {
301+
if !krate.extra_aliased_targets.is_empty() {
301302
tracing::warn!(
302-
"Skipping extra_aliased_targets alias `{alias}` for \
303-
workspace-member dep `{}-{}`: spoke repos are not \
304-
created for workspace members.",
303+
"Skipping extra_aliased_targets for workspace-member dep `{}-{}`: \
304+
spoke repos are not created for workspace members.",
305305
krate.name,
306306
krate.version,
307307
);
308-
continue;
309308
}
310-
dependencies.push(Alias {
311-
rule: alias_rule.rule(),
312-
name: alias.clone(),
313-
actual: self.crate_label(&krate.name, &krate.version.to_string(), target),
314-
tags: BTreeSet::from(["manual".to_owned()]),
315-
});
309+
} else {
310+
for (alias, target) in &krate.extra_aliased_targets {
311+
dependencies.push(Alias {
312+
rule: alias_rule.rule(),
313+
name: alias.clone(),
314+
actual: self.crate_label(&krate.name, &krate.version.to_string(), target),
315+
tags: BTreeSet::from(["manual".to_owned()]),
316+
});
317+
}
316318
}
317319
}
318320

@@ -2778,4 +2780,80 @@ mod test {
27782780
"extra_aliased_targets must not emit aliases for workspace member dep:\n{build_file_content}"
27792781
);
27802782
}
2783+
2784+
/// Tests that `extra_aliased_targets` aliases ARE emitted for external
2785+
/// (non-workspace-member) deps — i.e. the workspace-member guard does not
2786+
/// incorrectly suppress aliases for regular external crates.
2787+
#[test]
2788+
fn extra_aliased_targets_emitted_for_external_dep() {
2789+
let mut context = Context::default();
2790+
2791+
let consumer_id = CrateId::new("consumer".to_owned(), VERSION_ZERO_ONE_ZERO);
2792+
context
2793+
.workspace_members
2794+
.insert(consumer_id.clone(), "consumer".into());
2795+
2796+
// dep_crate is external: it is a dep of a workspace member but NOT
2797+
// itself in workspace_members.
2798+
let dep_id = CrateId::new("dep_crate".to_owned(), VERSION_ZERO_ONE_ZERO);
2799+
context.crates.insert(
2800+
dep_id.clone(),
2801+
CrateContext {
2802+
name: dep_id.name.clone(),
2803+
version: dep_id.version.clone(),
2804+
package_url: None,
2805+
targets: BTreeSet::from([Rule::Library(mock_target_attributes())]),
2806+
library_target_name: Some("dep_crate".to_owned()),
2807+
common_attrs: CommonAttributes::default(),
2808+
build_script_attrs: None,
2809+
repository: None,
2810+
license: None,
2811+
license_ids: BTreeSet::default(),
2812+
license_file: None,
2813+
additive_build_file_content: None,
2814+
disable_pipelining: false,
2815+
extra_aliased_targets: BTreeMap::from([("foo".to_owned(), "foo_impl".to_owned())]),
2816+
alias_rule: None,
2817+
override_targets: BTreeMap::default(),
2818+
},
2819+
);
2820+
context.crates.insert(
2821+
consumer_id.clone(),
2822+
CrateContext {
2823+
name: consumer_id.name.clone(),
2824+
version: consumer_id.version.clone(),
2825+
package_url: None,
2826+
targets: BTreeSet::from([Rule::Library(mock_target_attributes())]),
2827+
library_target_name: Some("consumer".to_owned()),
2828+
common_attrs: CommonAttributes {
2829+
deps: Select::from_value(BTreeSet::from([CrateDependency {
2830+
id: dep_id.clone(),
2831+
target: "dep_crate".to_owned(),
2832+
alias: None,
2833+
local_path: None,
2834+
}])),
2835+
..Default::default()
2836+
},
2837+
build_script_attrs: None,
2838+
repository: None,
2839+
license: None,
2840+
license_ids: BTreeSet::default(),
2841+
license_file: None,
2842+
additive_build_file_content: None,
2843+
disable_pipelining: false,
2844+
extra_aliased_targets: BTreeMap::default(),
2845+
alias_rule: None,
2846+
override_targets: BTreeMap::default(),
2847+
},
2848+
);
2849+
2850+
let renderer = Renderer::new(mock_render_config(None), mock_supported_platform_triples());
2851+
let output = renderer.render(&context, None).unwrap();
2852+
let build_file_content = output.get(&PathBuf::from("BUILD.bazel")).unwrap();
2853+
2854+
assert!(
2855+
build_file_content.contains(r#"name = "foo","#),
2856+
"extra_aliased_targets must emit aliases for external dep:\n{build_file_content}"
2857+
);
2858+
}
27812859
}

0 commit comments

Comments
 (0)