Bazel:我如何使用nodeJS_binary规则执行“ npm run start”

时间:2018-09-18 07:58:10

标签: javascript node.js npm bazel npm-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命令无法正确运行。它指示命令使用不完整。

我目前能够在WORKSPACE中完成此操作

bazel run @nodejs//:bin/yarn(运行yarn安装并安装所有节点调制)

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节点。 我对规则做了一些修改。经过仔细研究...我意识到在调用纱线运行开始时不满足于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包含运行bam-node依赖项,当运行npm / yarn start时可用)

所以我的问题是我不想在执行规则之前手动运行bazel run @nodejs//:bin/yarn。我该怎么做呢。 我想如果我根据babel-node停止运行,那会起作用的...但是然后,我不得不更改代码以不使用es6语法(这很麻烦)。有没有办法我可以做到这一点?或什么...

1 个答案:

答案 0 :(得分:0)

我最终要做的是我制定了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",
)