Javascript Bazel:我如何使用nodeJS“二进制规则做什么?”;“npm运行启动”;

Javascript Bazel:我如何使用nodeJS“二进制规则做什么?”;“npm运行启动”;,javascript,node.js,npm,bazel,npm-start,Javascript,Node.js,Npm,Bazel,Npm Start,如何使用nodejs\u binary规则执行标准npm运行启动。我能够使用此规则运行典型的节点项目。但是,我想在package.json中运行一个启动脚本。到目前为止,我的构建文件中有以下内容 load("@build_bazel_rules_nodejs//:defs.bzl", "nodejs_binary") nodejs_binary( name = "app", data = [":app_files"], node="@nodejs//:bin/npm",

如何使用
nodejs\u 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命令没有正常运行。它表示该命令的使用不完整

我目前可以在工作区内完成这项工作

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

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

在我的package.json中

{
  "scripts": {
    "start": "babel-node src/server.js",
   ...
  }
...
}
我要用nodejs_二进制规则和随后的node_图像来处理它

我从使用npm改为使用Thread..workspace\u name/src/server.js。。现在调用了,但我遇到了不同的问题,未找到babel节点。 我稍微修改了一下规则。经过仔细研究…我意识到在调用纱线运行开始时,对babel节点的依赖性并不满足。在运行规则之前,我运行了
bazel run@nodejs/:bin/warn
之后,下面的代码起了作用

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节点依赖性问题。因此,上述规则本身不起作用……它需要我执行
bazel run@nodejs//:bin/warn
(更像是npm/warn安装,以使节点_模块在运行npm/warn start时可用,其中包含巴贝尔节点依赖性)

所以我的问题是,我不想在执行规则之前手动运行
bazel run@nodejs/:bin/warn
。我该怎么做呢。
我想,如果我不再依赖babel节点,它会起作用……但随后我必须更改代码,使其不使用es6语法(这是一个麻烦)。有没有办法用genrule实现这一点?或者什么…

我最后做的是我做了一个babel-nodejs_二进制规则。然后用它在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"],
)
请注意,在这种情况下,src in
cmd=“$(location babel)src--out dir$@”
: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",
)

嗨,我认识巴泽尔,但我不认识诺德。您能否成功地构建规则而只是无法正确运行它?npm命令究竟是如何失败的,是有错误消息,还是只是使用了错误的参数运行,还是Bazel运行了超出您预期的内容?@László您可以查看我更新的问题。但为了回答你的问题,我目前可以构建和运行,但只有在特定条件下。我希望我对这个问题的更新更有意义。