bazel-contrib / bazel-contrib/rules_nodejs
[Bug]: `@nodejs//:node_bin` does not resolve to the correct path in `repository_rule`
- Dominant language
- Starlark
- Stars
- 762
- Forks
- 531
- Avg merge
- 10h 31m
- Merged PRs (30d)
- 3
Description
### What happened?
The label `@nodejs//:node_bin` does not resolve to the correct path to the Node.js binary when used inside of `repository_rule`. The path I get is:
```
external/rules_nodejs~~node~nodejs/node_bin
```
While the correct path (on my system) should be:
```
external/rules_nodejs~~node~nodejs_linux_amd64/bin/nodejs/bin/node
```
### Version
Development (host) and target OS/architectures:
```
x86_64 GNU/Linux
```
Output of `bazel --version`:
```
bazel 7.2.1
```
Version of rules_nodejs, or other relevant rules from your `WORKSPACE` or `MODULE.bazel` file:
```
6.3.2
```
Language(s) and/or frameworks involved:
```
None
```
### How to reproduce
I have created a template repository that can be opened in Github Codespaces here (just click the "Use this template" and "Open in a codespace" buttons): https://github.com/allsey87/nodejs_bazel_mre
Once the Codespace has been built, run: `bazel build //:repository_nodejs` and note the incorrect path printed inside of `bazel-bin/repository_nodejs.txt`.
Alternatively, these three files make up the same MRE of the problem:
**MODULE.bazel**
```starlark
bazel_dep(name = "rules_nodejs", version = "6.3.2")
node = use_extension("@rules_nodejs//nodejs:extensions.bzl", "node")
node.toolchain(node_version = "20.14.0")
use_repo(node, "nodejs", "nodejs_toolchains")
test_repository = use_repo_rule("//:repository.bzl", "test_repository")
test_repository(name = "repository_nodejs")
```
**repository.bzl**
```starlark
def _test_repository_impl(ctx):
ctx.file(".config", "{}".format(ctx.path(ctx.attr._nodejs)))
ctx.file("BUILD.bazel", """
filegroup(
name = "config",
srcs = [".config"],
visibility = ["//visibility:public"],
)
""")
test_repository = repository_rule(
_test_repository_impl,
attrs = {
"_nodejs": attr.label(
default = Label("@nodejs//:node_bin"),
executable = True,
cfg = "exec"
)
}
)
```
**BUILD.bazel**
```starlark
# This rule does not result in nodejs being fetched and gives us an absolute path that ends with:
# external/rules_nodejs~~node~nodejs/node_bin (incorrect)
# The correct path should be:
# external/rules_nodejs~~node~nodejs_linux_amd64/bin/nodejs/bin/node
genrule(
name = "repository_nodejs",
outs = ["repository_nodejs.txt"],
cmd = "cat $(execpath @repository_nodejs//:config) >> $(OUTS)",
tools = [
"@repository_nodejs//:config"
]
)
```
Contributor guide
Assessment
This issue has not been assessed yet.