Mark `modules.as_extension` as `reproducible` (#497)
WORKSPACE macros are fully deterministic and thus a prime example of a `reproducible` module extension. This reduces clutter in `MODULE.bazel.lock`.
This commit is contained in:
parent
09b1079228
commit
1969278310
|
@ -34,7 +34,8 @@ rules_foo_deps_ext = modules.as_extension(rules_foo_deps)
|
||||||
|
|
||||||
A module extension that generates the repositories instantiated by the given macro and also
|
A module extension that generates the repositories instantiated by the given macro and also
|
||||||
uses [`use_all_repos`](#use_all_repos) to indicate that all of those repositories should be
|
uses [`use_all_repos`](#use_all_repos) to indicate that all of those repositories should be
|
||||||
imported via `use_repo`.
|
imported via `use_repo`. The extension is marked as reproducible if supported by the current
|
||||||
|
version of Bazel and thus doesn't result in a lockfile entry.
|
||||||
|
|
||||||
|
|
||||||
<a id="modules.use_all_repos"></a>
|
<a id="modules.use_all_repos"></a>
|
||||||
|
@ -42,7 +43,7 @@ imported via `use_repo`.
|
||||||
## modules.use_all_repos
|
## modules.use_all_repos
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
modules.use_all_repos(<a href="#modules.use_all_repos-module_ctx">module_ctx</a>)
|
modules.use_all_repos(<a href="#modules.use_all_repos-module_ctx">module_ctx</a>, <a href="#modules.use_all_repos-reproducible">reproducible</a>)
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
Return from a module extension that should have all its repositories imported via `use_repo`.
|
Return from a module extension that should have all its repositories imported via `use_repo`.
|
||||||
|
@ -64,6 +65,7 @@ ext = module_extension(_ext_impl)
|
||||||
| Name | Description | Default Value |
|
| Name | Description | Default Value |
|
||||||
| :------------- | :------------- | :------------- |
|
| :------------- | :------------- | :------------- |
|
||||||
| <a id="modules.use_all_repos-module_ctx"></a>module_ctx | The [<code>module_ctx</code>](https://bazel.build/rules/lib/builtins/module_ctx) object passed to the module extension's implementation function. | none |
|
| <a id="modules.use_all_repos-module_ctx"></a>module_ctx | The [<code>module_ctx</code>](https://bazel.build/rules/lib/builtins/module_ctx) object passed to the module extension's implementation function. | none |
|
||||||
|
| <a id="modules.use_all_repos-reproducible"></a>reproducible | The value of the <code>reproducible</code> parameter to pass to the [<code>extension_metadata</code>](https://bazel.build/rules/lib/builtins/extension_metadata.html) object returned by this function. This is safe to set with Bazel versions that don't support this parameter and will be ignored in that case. | <code>False</code> |
|
||||||
|
|
||||||
**RETURNS**
|
**RETURNS**
|
||||||
|
|
||||||
|
|
|
@ -35,19 +35,23 @@ def _as_extension(macro, doc = None):
|
||||||
Returns:
|
Returns:
|
||||||
A module extension that generates the repositories instantiated by the given macro and also
|
A module extension that generates the repositories instantiated by the given macro and also
|
||||||
uses [`use_all_repos`](#use_all_repos) to indicate that all of those repositories should be
|
uses [`use_all_repos`](#use_all_repos) to indicate that all of those repositories should be
|
||||||
imported via `use_repo`.
|
imported via `use_repo`. The extension is marked as reproducible if supported by the current
|
||||||
|
version of Bazel and thus doesn't result in a lockfile entry.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def _ext_impl(module_ctx):
|
def _ext_impl(module_ctx):
|
||||||
macro()
|
macro()
|
||||||
return _use_all_repos(module_ctx)
|
|
||||||
|
# Setting `reproducible` is safe since `macro`, as a function without parameters, must be
|
||||||
|
# deterministic.
|
||||||
|
return _use_all_repos(module_ctx, reproducible = True)
|
||||||
|
|
||||||
return module_extension(
|
return module_extension(
|
||||||
implementation = _ext_impl,
|
implementation = _ext_impl,
|
||||||
doc = doc,
|
doc = doc,
|
||||||
)
|
)
|
||||||
|
|
||||||
def _use_all_repos(module_ctx):
|
def _use_all_repos(module_ctx, reproducible = False):
|
||||||
"""Return from a module extension that should have all its repositories imported via `use_repo`.
|
"""Return from a module extension that should have all its repositories imported via `use_repo`.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
@ -63,6 +67,10 @@ def _use_all_repos(module_ctx):
|
||||||
Args:
|
Args:
|
||||||
module_ctx: The [`module_ctx`](https://bazel.build/rules/lib/builtins/module_ctx) object
|
module_ctx: The [`module_ctx`](https://bazel.build/rules/lib/builtins/module_ctx) object
|
||||||
passed to the module extension's implementation function.
|
passed to the module extension's implementation function.
|
||||||
|
reproducible: The value of the `reproducible` parameter to pass to the
|
||||||
|
[`extension_metadata`](https://bazel.build/rules/lib/builtins/extension_metadata.html)
|
||||||
|
object returned by this function. This is safe to set with Bazel versions that don't
|
||||||
|
support this parameter and will be ignored in that case.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
An [`extension_metadata`](https://bazel.build/rules/lib/builtins/extension_metadata.html)
|
An [`extension_metadata`](https://bazel.build/rules/lib/builtins/extension_metadata.html)
|
||||||
|
@ -88,9 +96,18 @@ def _use_all_repos(module_ctx):
|
||||||
if root_module_has_non_dev_dependency == None:
|
if root_module_has_non_dev_dependency == None:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
# module_ctx.extension_metadata has the paramater `reproducible` as of Bazel 7.1.0. We can't
|
||||||
|
# test for it directly and would ideally use bazel_features to check for it, but adding a
|
||||||
|
# dependency on it would require complicating the WORKSPACE setup for skylib. Thus, test for
|
||||||
|
# it by checking the availability of another feature introduced in 7.1.0.
|
||||||
|
extension_metadata_kwargs = {}
|
||||||
|
if hasattr(module_ctx, "watch"):
|
||||||
|
extension_metadata_kwargs["reproducible"] = reproducible
|
||||||
|
|
||||||
return extension_metadata(
|
return extension_metadata(
|
||||||
root_module_direct_deps = "all" if root_module_has_non_dev_dependency else [],
|
root_module_direct_deps = "all" if root_module_has_non_dev_dependency else [],
|
||||||
root_module_direct_dev_deps = [] if root_module_has_non_dev_dependency else "all",
|
root_module_direct_dev_deps = [] if root_module_has_non_dev_dependency else "all",
|
||||||
|
**extension_metadata_kwargs
|
||||||
)
|
)
|
||||||
|
|
||||||
modules = struct(
|
modules = struct(
|
||||||
|
|
Loading…
Reference in New Issue