如何使用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语法(这很麻烦)。有没有办法我可以做到这一点?或什么...
答案 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",
)