Bazel:我如何使用 nodeJS_binary 规则来执行 "npm run start"

Bazel: How do i use nodeJS_binary rule to do "npm run start"

如何使用 nodejs_binary 规则执行标准 npm 运行 启动。我能够 运行 使用此规则的典型节点项目。但是我想 运行 在 package.json 中创建启动脚本。到目前为止,我的构建文件中有以下内容

load("@build_bazel_rules_nodejs//:defs.bzl", "nodejs_binary")

nodejs_binary(
    name = "app",
    data = [":app_files"],
    node="@nodejs//:bin/npm",
    entry_point = "workspace_name/src/server.js",
    node_modules = "@npm_deps//:node_modules",
    args=["start"]
)

这不会启动服务器..不知何故 npm 命令没有正确 运行ning。它表示命令的使用不完整。

我目前可以在 WORKSPACE 中执行此操作

bazel run @nodejs//:bin/yarn(运行s yarn install 并安装所有节点模块)

bazel run @nodejs//:bin/npm start(这会启动服务器)

在我的 package.json 我有

{
  "scripts": {
    "start": "babel-node src/server.js",
   ...
  }
...
}

我让这个与 nodejs_binary 规则一起使用,随后 node_image

我从使用 npm 改为使用 yarn..workspace_name/src/server.js.. 现在被调用了,但是后来我遇到了不同的问题,找不到 babel-node。 我稍微修改了规则。仔细研究后...我意识到在调用 yarn 运行 start 时不满足对 babel-node 的依赖。在 运行 规则之前我有 运行 bazel run @nodejs//:bin/yarn 之后,以下工作。

nodejs_binary(
    name = "app",
    args = ["start"],
    data = [
        ":app_files",
        "@//:node_modules",
    ],
    entry_point = "workspace_name/src/server.js",
    node = "@nodejs//:bin/yarn",
    node_modules = "@npm_deps//:node_modules",
)

看来 "@//:node_modules" 解决了 babel-node 依赖问题。所以上面的规则本身不起作用......它需要我做 bazel run @nodejs//:bin/yarn(更像是 npm/yarn 安装来制作 node_modules,其中包含 babel-node 依赖关系在 npm/yarn开始是运行)

所以我的问题是我不想在执行我的规则之前必须手动 运行 bazel run @nodejs//:bin/yarn。我该怎么做呢。 我想如果我停止依赖 babel-node 它会起作用......但是我将不得不更改我的代码以不使用 es6 语法(这是一个喧嚣)。有没有办法我可以用 genrule 做到这一点?或者什么的...

我最后做的是我制定了一个 babel nodejs_binary 规则。然后用它在 gen 规则

中编译我的源文件
# Make babel binary
nodejs_binary(
    name = "babel",
    entry_point = "npm_deps/node_modules/babel-cli/bin/babel",
    install_source_map_support = False,
    node_modules = "@npm_deps//:node_modules",
)

# Compile source files with babel
genrule(
    name = "compiled_src",
    srcs = [
        ":src_files",
    ],
    outs = ["src"],
    cmd = "$(location babel) src  --out-dir $@",
    tools = [":babel"],
)

请注意,在这种情况下,cmd = "$(location babel) src --out-dir $@" 中的 src 是 :src_files 文件组中的一个文件夹。

filegroup(
    name = "src_files",
    srcs = glob([
        "src/**/*",
        ...
    ]),
)

此后就没必要再用了npm start,只用了默认节点。我可以做

nodejs_binary(
    name = "app",
    data = [":compiled_src"],
    entry_point = "workspace_name/src/server.js",
    node_modules = "@npm_deps//:node_modules",
)