Skip to content

Commit ee2b159

Browse files
author
Tamas Vajk
committed
Add crate_package_default_visibility to render_config
Allow configuring the default_visibility of individual crate BUILD packages generated by crate_universe. By default, crate packages use //visibility:public. Setting crate_package_default_visibility restricts direct references to crate targets, encouraging consumers to go through top-level aliases instead. This is useful in monorepos where visibility control helps enforce dependency hygiene. Example usage in render_config(): render_config( crate_package_default_visibility = ["//third_party/rust:__subpackages__"], )
1 parent f31db8b commit ee2b159

3 files changed

Lines changed: 32 additions & 5 deletions

File tree

crate_universe/private/generate_utils.bzl

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,18 +91,19 @@ def get_generator(repository_ctx, host_triple):
9191

9292
def render_config(
9393
build_file_template = "//:BUILD.{name}-{version}.bazel",
94-
crate_label_template = "@{repository}__{name}-{version}//:{target}",
9594
crate_alias_template = "//:{name}-{version}",
95+
crate_label_template = "@{repository}__{name}-{version}//:{target}",
96+
crate_package_default_visibility = None,
9697
crate_repository_template = "{repository}__{name}-{version}",
9798
crates_module_template = "//:{file}",
9899
default_alias_rule = "alias",
99100
default_package_name = None,
100101
generate_cargo_toml_env_vars = True,
102+
generate_rules_license_metadata = False,
101103
generate_target_compatible_with = True,
102104
platforms_template = "@rules_rust//rust/platform:{triple}",
103105
regen_command = None,
104-
vendor_mode = None,
105-
generate_rules_license_metadata = False):
106+
vendor_mode = None):
106107
"""Various settings used to configure rendered outputs
107108
108109
The template parameters each support a select number of format keys. A description of each key
@@ -126,6 +127,9 @@ def render_config(
126127
available format keys are [`{repository}`, `{name}`, `{version}`].
127128
crate_alias_template (str, optional): The template to use when referring to generated aliases within the external
128129
repository. The available format keys are [`{repository}`, `{name}`, `{version}`].
130+
crate_package_default_visibility (list, optional): The default_visibility for individual crate BUILD packages.
131+
If None, defaults to `["//visibility:public"]`. Set to restrict direct references to crate targets so
132+
that consumers must use the top-level aliases.
129133
crates_module_template (str, optional): The pattern to use for the `defs.bzl` and `BUILD.bazel`
130134
file names used for the crates module. The available format keys are [`{file}`].
131135
default_alias_rule (str, option): Alias rule to use when generating aliases for all crates. Acceptable values
@@ -153,6 +157,7 @@ def render_config(
153157
build_file_template = build_file_template,
154158
crate_alias_template = crate_alias_template,
155159
crate_label_template = crate_label_template,
160+
crate_package_default_visibility = crate_package_default_visibility,
156161
crate_repository_template = crate_repository_template,
157162
crates_module_template = crates_module_template,
158163
default_alias_rule = parse_alias_rule(default_alias_rule),

crate_universe/src/config.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,11 @@ pub(crate) struct RenderConfig {
107107
/// Whether to generate cargo_toml_env_vars targets.
108108
/// This is expected to always be true except for bootstrapping.
109109
pub(crate) generate_cargo_toml_env_vars: bool,
110+
111+
/// The default_visibility for individual crate BUILD packages. If None,
112+
/// defaults to ["//visibility:public"]. Set to restrict direct references
113+
/// to crate targets so that consumers must use the top-level aliases.
114+
pub(crate) crate_package_default_visibility: Option<Vec<String>>,
110115
}
111116

112117
// Default is manually implemented so that the default values match the default
@@ -129,6 +134,7 @@ impl Default for RenderConfig {
129134
regen_command: String::default(),
130135
vendor_mode: Option::default(),
131136
generate_rules_license_metadata: default_generate_rules_license_metadata(),
137+
crate_package_default_visibility: None,
132138
}
133139
}
134140
}

crate_universe/src/rendering.rs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -436,7 +436,7 @@ impl Renderer {
436436
});
437437
}
438438

439-
let package = Package::default_visibility_public(package_metadata);
439+
let package = self.crate_package(package_metadata);
440440
starlark.push(Starlark::Package(package));
441441

442442
starlark.push(Starlark::PackageInfo(starlark::PackageInfo {
@@ -461,7 +461,7 @@ impl Renderer {
461461
}
462462
} else {
463463
// Package visibility.
464-
let package = Package::default_visibility_public(BTreeSet::new());
464+
let package = self.crate_package(BTreeSet::new());
465465
starlark.push(Starlark::Package(package));
466466
}
467467

@@ -890,6 +890,22 @@ impl Renderer {
890890
)
891891
}
892892

893+
/// Constructs a `Package` for an individual crate BUILD file, using
894+
/// `crate_package_default_visibility` from the render config if set,
895+
/// otherwise falling back to `//visibility:public`.
896+
fn crate_package(&self, default_package_metadata: BTreeSet<Label>) -> Package {
897+
match &self.config.crate_package_default_visibility {
898+
Some(visibility) => {
899+
let default_visibility = visibility.iter().cloned().collect();
900+
Package {
901+
default_package_metadata,
902+
default_visibility,
903+
}
904+
}
905+
None => Package::default_visibility_public(default_package_metadata),
906+
}
907+
}
908+
893909
fn render_vendor_support_files(
894910
&self,
895911
engine: &TemplateEngine,

0 commit comments

Comments
 (0)