node.js - Bazel 运行 nodejs 目标并表达依赖关系
问题描述
我正在构建一个简单的 nodejs 应用程序,并希望使用 Bazel(bazel 中的新手)运行它 - 使用 bazel 版本 0.28.1
我的 package.json
{
"name": "nodeapp",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "node index.js"
},
"dependencies": {
"lodash": "4.17.15"
},
"author": "",
"license": "ISC"
}
我的 index.js
const _ = require("lodash")
const ver = _.VERSION
console.log(ver);
我的 BUILD.bazel
load("@build_bazel_rules_nodejs//:defs.bzl", "nodejs_binary")
nodejs_binary(
name = "app",
install_source_map_support = False,
data = [
"index.js",
"@npm//lodash",
],
entry_point = "index.js",
)
我的工作空间
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
RULES_NODEJS_VERSION = "0.32.2"
RULES_NODEJS_SHA256 =
"6d4edbf28ff6720aedf5f97f9b9a7679401bf7fca9d14a0fff80f644a99992b4"
http_archive(
name = "build_bazel_rules_nodejs",
sha256 = RULES_NODEJS_SHA256,
url =`"https://github.com/bazelbuild/rules_nodejs/releases/download/%s/rules_nodejs-%s.tar.gz" % (RULES_NODEJS_VERSION, RULES_NODEJS_VERSION),`
)
load("@build_bazel_rules_nodejs//:defs.bzl", "node_repositories", "npm_install")
# Setup the Node.js toolchain & install our npm dependencies into @npm
npm_install(
name = "npm",
package_json = "//:package.json",
package_lock_json = "//:package-lock.json",
)
从 node_app 目录,我执行bazel clean && bazel run //:app
,它工作正常
现在我的问题是
- 任何让 nodejs_binary 传播所有 node_modules 的方法,而不是进入并将它们列为 BUILD.bazel 文件中的“@npm//lodash”(比如使用文件组)
- 如果我删除 node_modules 目录,则 bazel 执行将在此之后停止工作。感觉好像没有必要再次执行“npm install”。我错过了什么?
- 如果我不更改 package.json 而是向 index.js 添加更多代码,那么后续构建是否足够智能以不执行“npm install”,因为它不是必需的?
解决方案
任何让 nodejs_binary 传播所有 node_modules 的方法,而不是进入并将它们列为 BUILD.bazel 文件中的“@npm//lodash”(比如使用文件组)
yarn_install
此行为在 rules_nodejs 的 0.13.0 版本中已弃用,推荐的方法是使用通过ornpm_install
规则设置的细粒度 npm 依赖项。这有助于减少为目标设置运行文件所需的时间。完整示例和说明在此处内置规则中node_modules
属性的文档中: https ://bazelbuild.github.io/rules_nodejs/Built-ins.htmlnodejs_binary
如果我不更改 package.json 而是向 index.js 添加更多代码,那么后续构建是否足够智能以不执行“npm install”,因为它不是必需的?
是的,bazel 不应该为这样的源代码更改运行另一个npm install
或重建node_module
目录。事实上,bazel run
只改变 js 文件中的一行就可以运行了。
推荐阅读
- python - 带 Gif 图像的 ImDecode
- f# - F# SQLProvider 错误 FS0039:类型“dataContext”未定义字段、构造函数或成员“test”。在演示中
- node.js - 提取 JWT 时请求未定义
- scala - Scala中是否有一些基于条件的类型?
- amazon-web-services - 在 eks 中为服务创建服务端点
- c# - 带有附加参数的 WebApi POST
- git - 如何推送没有文件夹 .gitignore 规则的文件来提供
- python - 为什么 QMainWindow 不显示?
- c++ - 共享库“混淆” - 剥离内部 api 上的所有符号/字符串;符号路径以 PN4、N2、N3、N4 开头
- python - 以下代码段的输出是什么意思?