@@ -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