refactor: register_node_modules_linker just writes the manifest This makes it easier to reuse in nodejs_binary
diff --git a/internal/linker/link_node_modules.bzl b/internal/linker/link_node_modules.bzl index 739fe13..d3d2dcb 100644 --- a/internal/linker/link_node_modules.bzl +++ b/internal/linker/link_node_modules.bzl
@@ -34,14 +34,12 @@ else: args.add(arg) -def register_node_modules_linker(ctx, args, inputs, data = []): - """Helps an action to run node by setting up the node_modules linker as a pre-process +def write_node_modules_manifest(ctx, extra_data = []): + """Writes a manifest file read by the linker, containing info about resolving runtime dependencies Args: - ctx: Bazel's starlark execution context, used to get attributes and actions - args: Arguments being passed to the program; a linker argument will be appended - inputs: inputs being passed to the program; a linker input will be appended - data: labels to search for npm packages that need to be linked (ctx.attr.deps and ctx.attr.data will always be searched) + ctx: starlark rule execution context + extra_data: labels to search for npm packages that need to be linked (ctx.attr.deps and ctx.attr.data will always be searched) """ mappings = { @@ -53,7 +51,7 @@ node_modules_root = "" # Look through data/deps attributes to find... - for dep in data + getattr(ctx.attr, "data", []) + getattr(ctx.attr, "deps", []): + for dep in extra_data + getattr(ctx.attr, "data", []) + getattr(ctx.attr, "deps", []): # ...the root directory for the third-party node_modules; we'll symlink the local "node_modules" to it if NpmPackageInfo in dep: possible_root = "/".join([dep[NpmPackageInfo].workspace, "node_modules"]) @@ -80,8 +78,7 @@ "workspace": ctx.workspace_name, } ctx.actions.write(modules_manifest, str(content)) - add_arg(args, "--bazel_node_modules_manifest=%s" % modules_manifest.path) - inputs.append(modules_manifest) + return modules_manifest def get_module_mappings(label, attrs, vars, rule_kind, srcs = [], workspace_name = None): """Returns the module_mappings from the given attrs.
diff --git a/internal/linker/test/integration/rule.bzl b/internal/linker/test/integration/rule.bzl index 5578aa6..157cbb0 100644 --- a/internal/linker/test/integration/rule.bzl +++ b/internal/linker/test/integration/rule.bzl
@@ -1,18 +1,17 @@ "Minimal fixture for executing the linker's starlark code" -load("@build_bazel_rules_nodejs//internal/linker:link_node_modules.bzl", "module_mappings_aspect", "register_node_modules_linker") +load("@build_bazel_rules_nodejs//internal/linker:link_node_modules.bzl", "module_mappings_aspect", "write_node_modules_manifest") def _linked(ctx): - inputs = ctx.files.deps[:] - outputs = [ctx.outputs.out] - args = ctx.actions.args() - register_node_modules_linker(ctx, args, inputs) - args.add(ctx.outputs.out.path) + modules_manifest = write_node_modules_manifest(ctx) ctx.actions.run( - inputs = inputs, - outputs = outputs, + inputs = ctx.files.deps + [modules_manifest], + outputs = [ctx.outputs.out], executable = ctx.executable.program, - arguments = [args], + arguments = [ + "--bazel_node_modules_manifest=%s" % modules_manifest.path, + ctx.outputs.out.path, + ], ) linked = rule(_linked, attrs = {
diff --git a/internal/providers/node_runtime_deps_info.bzl b/internal/providers/node_runtime_deps_info.bzl index efa90f7..90a6942 100644 --- a/internal/providers/node_runtime_deps_info.bzl +++ b/internal/providers/node_runtime_deps_info.bzl
@@ -14,7 +14,7 @@ """ Custom provider that mimics the Runfiles, but doesn't incur the expense of creating the runfiles symlink tree""" -load("//internal/linker:link_node_modules.bzl", "add_arg", "register_node_modules_linker") +load("//internal/linker:link_node_modules.bzl", "add_arg", "write_node_modules_manifest") NodeRuntimeDepsInfo = provider( doc = """Stores runtime dependencies of a nodejs_binary or nodejs_test @@ -54,7 +54,9 @@ extra_inputs = exec_attr[NodeRuntimeDepsInfo].deps.to_list() link_data = exec_attr[NodeRuntimeDepsInfo].pkgs - register_node_modules_linker(ctx, arguments, inputs, link_data) + modules_manifest = write_node_modules_manifest(ctx, link_data) + add_arg(arguments, "--bazel_node_modules_manifest=%s" % modules_manifest.path) + inputs.append(modules_manifest) # By using the run_node helper, you suggest that your program # doesn't implicitly use runfiles to require() things