Skip to content

Commit aa1bb6f

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 83b88e2 commit aa1bb6f

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

@@ -2704,4 +2706,80 @@ mod test {
27042706
"extra_aliased_targets must not emit aliases for workspace member dep:\n{build_file_content}"
27052707
);
27062708
}
2709+
2710+
/// Tests that `extra_aliased_targets` aliases ARE emitted for external
2711+
/// (non-workspace-member) deps — i.e. the workspace-member guard does not
2712+
/// incorrectly suppress aliases for regular external crates.
2713+
#[test]
2714+
fn extra_aliased_targets_emitted_for_external_dep() {
2715+
let mut context = Context::default();
2716+
2717+
let consumer_id = CrateId::new("consumer".to_owned(), VERSION_ZERO_ONE_ZERO);
2718+
context
2719+
.workspace_members
2720+
.insert(consumer_id.clone(), "consumer".into());
2721+
2722+
// dep_crate is external: it is a dep of a workspace member but NOT
2723+
// itself in workspace_members.
2724+
let dep_id = CrateId::new("dep_crate".to_owned(), VERSION_ZERO_ONE_ZERO);
2725+
context.crates.insert(
2726+
dep_id.clone(),
2727+
CrateContext {
2728+
name: dep_id.name.clone(),
2729+
version: dep_id.version.clone(),
2730+
package_url: None,
2731+
targets: BTreeSet::from([Rule::Library(mock_target_attributes())]),
2732+
library_target_name: Some("dep_crate".to_owned()),
2733+
common_attrs: CommonAttributes::default(),
2734+
build_script_attrs: None,
2735+
repository: None,
2736+
license: None,
2737+
license_ids: BTreeSet::default(),
2738+
license_file: None,
2739+
additive_build_file_content: None,
2740+
disable_pipelining: false,
2741+
extra_aliased_targets: BTreeMap::from([("foo".to_owned(), "foo_impl".to_owned())]),
2742+
alias_rule: None,
2743+
override_targets: BTreeMap::default(),
2744+
},
2745+
);
2746+
context.crates.insert(
2747+
consumer_id.clone(),
2748+
CrateContext {
2749+
name: consumer_id.name.clone(),
2750+
version: consumer_id.version.clone(),
2751+
package_url: None,
2752+
targets: BTreeSet::from([Rule::Library(mock_target_attributes())]),
2753+
library_target_name: Some("consumer".to_owned()),
2754+
common_attrs: CommonAttributes {
2755+
deps: Select::from_value(BTreeSet::from([CrateDependency {
2756+
id: dep_id.clone(),
2757+
target: "dep_crate".to_owned(),
2758+
alias: None,
2759+
local_path: None,
2760+
}])),
2761+
..Default::default()
2762+
},
2763+
build_script_attrs: None,
2764+
repository: None,
2765+
license: None,
2766+
license_ids: BTreeSet::default(),
2767+
license_file: None,
2768+
additive_build_file_content: None,
2769+
disable_pipelining: false,
2770+
extra_aliased_targets: BTreeMap::default(),
2771+
alias_rule: None,
2772+
override_targets: BTreeMap::default(),
2773+
},
2774+
);
2775+
2776+
let renderer = Renderer::new(mock_render_config(None), mock_supported_platform_triples());
2777+
let output = renderer.render(&context, None).unwrap();
2778+
let build_file_content = output.get(&PathBuf::from("BUILD.bazel")).unwrap();
2779+
2780+
assert!(
2781+
build_file_content.contains(r#"name = "foo","#),
2782+
"extra_aliased_targets must emit aliases for external dep:\n{build_file_content}"
2783+
);
2784+
}
27072785
}

0 commit comments

Comments
 (0)