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",
)
如何使用 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",
)