From 85ca69938dafa5a407106ac4b19005e83d25490d Mon Sep 17 00:00:00 2001 From: Jordan Mele Date: Mon, 15 Jan 2024 10:56:04 +1100 Subject: [PATCH 1/5] Hook to run command before `node_modules` installed --- internal/npm_install/npm_install.bzl | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/internal/npm_install/npm_install.bzl b/internal/npm_install/npm_install.bzl index c12c6248..f9d1070e 100755 --- a/internal/npm_install/npm_install.bzl +++ b/internal/npm_install/npm_install.bzl @@ -308,6 +308,13 @@ data attribute. default = 3600, doc = """Maximum duration of the package manager execution in seconds.""", ), + "preinstall_cmd": attr.string_list( + doc = """ + Command to run before installing `node_modules`. + + First argument must be an exectuable, CWD will be that of package directory. + """, + ), "_inputs": attr.label_list( default = [ "//internal/npm_install:pre_process_package_json.js", @@ -333,6 +340,19 @@ PROXY_ENVVARS = [ "all_proxy", ] +def _run_preinstall_cmd(repository_ctx): + if len(repository_ctx.attr.preinstall_cmd) > 0: + repository_ctx.report_process("Running preinstall command") + result = repository_ctx.execute( + repository_ctx.attr.preinstall_cmd, + timeout = repository_ctx.attr.timeout, + quiet = repository_ctx.attr.quiet, + environment = env, + working_directory = repository_ctx.path(repository_ctx.attr.package_json).dirname, + ) + if result.return_code: + fail("preinstall command failed: %s (%s)" % (result.stdout, result.stderr)) + def _apply_pre_install_patches(repository_ctx): if len(repository_ctx.attr.pre_install_patches) == 0: return @@ -685,6 +705,8 @@ cd /D "{root}" && "{npm}" {npm_args} env = _propagate_http_proxy_env(repository_ctx, env) + _run_preinstall_cmd(repository_ctx) + # NB: after running npm install, it's essential that we don't cause the repository rule to restart # This means we must not reference any additional labels after this point. # See https://github.com/bazelbuild/rules_nodejs/issues/2620 @@ -848,6 +870,8 @@ cd /D "{root}" && "{yarn}" {yarn_args} env = _propagate_http_proxy_env(repository_ctx, env) + _run_preinstall_cmd(repository_ctx) + repository_ctx.report_progress("Running yarn install on %s" % repository_ctx.attr.package_json) result = repository_ctx.execute( [repository_ctx.path("_yarn.cmd" if is_windows_host else "_yarn.sh")], From 7aefdffe4c2624bdc648ad1b89a9b663a96d5a07 Mon Sep 17 00:00:00 2001 From: Jordan Mele Date: Wed, 24 Jan 2024 12:56:18 +1100 Subject: [PATCH 2/5] Add `env` --- internal/npm_install/npm_install.bzl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/internal/npm_install/npm_install.bzl b/internal/npm_install/npm_install.bzl index f9d1070e..8e1bedeb 100755 --- a/internal/npm_install/npm_install.bzl +++ b/internal/npm_install/npm_install.bzl @@ -340,7 +340,7 @@ PROXY_ENVVARS = [ "all_proxy", ] -def _run_preinstall_cmd(repository_ctx): +def _run_preinstall_cmd(repository_ctx, env): if len(repository_ctx.attr.preinstall_cmd) > 0: repository_ctx.report_process("Running preinstall command") result = repository_ctx.execute( @@ -705,7 +705,7 @@ cd /D "{root}" && "{npm}" {npm_args} env = _propagate_http_proxy_env(repository_ctx, env) - _run_preinstall_cmd(repository_ctx) + _run_preinstall_cmd(repository_ctx, env) # NB: after running npm install, it's essential that we don't cause the repository rule to restart # This means we must not reference any additional labels after this point. @@ -870,7 +870,7 @@ cd /D "{root}" && "{yarn}" {yarn_args} env = _propagate_http_proxy_env(repository_ctx, env) - _run_preinstall_cmd(repository_ctx) + _run_preinstall_cmd(repository_ctx, env) repository_ctx.report_progress("Running yarn install on %s" % repository_ctx.attr.package_json) result = repository_ctx.execute( From add69ab6ad418a21331d74423481cd7ab3eaebf8 Mon Sep 17 00:00:00 2001 From: Jordan Mele Date: Wed, 24 Jan 2024 12:58:41 +1100 Subject: [PATCH 3/5] `report_process` -> `report_progess` --- internal/npm_install/npm_install.bzl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/npm_install/npm_install.bzl b/internal/npm_install/npm_install.bzl index 5e8e9eb4..d72aaf1f 100755 --- a/internal/npm_install/npm_install.bzl +++ b/internal/npm_install/npm_install.bzl @@ -342,7 +342,7 @@ PROXY_ENVVARS = [ def _run_preinstall_cmd(repository_ctx, env): if len(repository_ctx.attr.preinstall_cmd) > 0: - repository_ctx.report_process("Running preinstall command") + repository_ctx.report_progess("Running preinstall command") result = repository_ctx.execute( repository_ctx.attr.preinstall_cmd, timeout = repository_ctx.attr.timeout, From 8df01ec37d9663d69ccdb4ba2744602f78ac4d1d Mon Sep 17 00:00:00 2001 From: Jordan Mele Date: Wed, 24 Jan 2024 13:00:38 +1100 Subject: [PATCH 4/5] `report_progess -> `report_progress` --- internal/npm_install/npm_install.bzl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/npm_install/npm_install.bzl b/internal/npm_install/npm_install.bzl index d72aaf1f..e2f48a4c 100755 --- a/internal/npm_install/npm_install.bzl +++ b/internal/npm_install/npm_install.bzl @@ -342,7 +342,7 @@ PROXY_ENVVARS = [ def _run_preinstall_cmd(repository_ctx, env): if len(repository_ctx.attr.preinstall_cmd) > 0: - repository_ctx.report_progess("Running preinstall command") + repository_ctx.report_progress("Running preinstall command") result = repository_ctx.execute( repository_ctx.attr.preinstall_cmd, timeout = repository_ctx.attr.timeout, From f9f1f898515b9ab6e453c4e7bf5cf4aacd519b75 Mon Sep 17 00:00:00 2001 From: Jordan Mele Date: Wed, 24 Jan 2024 13:03:07 +1100 Subject: [PATCH 5/5] `repository_ctx.execute` wants `string` not `path` for `working_directory` --- internal/npm_install/npm_install.bzl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/npm_install/npm_install.bzl b/internal/npm_install/npm_install.bzl index e2f48a4c..f1904866 100755 --- a/internal/npm_install/npm_install.bzl +++ b/internal/npm_install/npm_install.bzl @@ -348,7 +348,7 @@ def _run_preinstall_cmd(repository_ctx, env): timeout = repository_ctx.attr.timeout, quiet = repository_ctx.attr.quiet, environment = env, - working_directory = repository_ctx.path(repository_ctx.attr.package_json).dirname, + working_directory = str(repository_ctx.path(repository_ctx.attr.package_json).dirname), ) if result.return_code: fail("preinstall command failed: %s (%s)" % (result.stdout, result.stderr))