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