Bazel运行nodejs目标并表达依赖性

时间:2019-08-28 22:32:57

标签: node.js bazel

我正在构建一个简单的nodejs应用程序,并希望使用Bazel(bazel中的新手)运行它-使用bazel版本0.28.1

enter image description here

我的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,它工作正常

enter image description here

我现在的问题是

  1. 任何使nodejs_binary散布所有node_modules的方法,而不是将它们放入BUILD.bazel文件中并将其列出为“ @ npm // lodash”(例如,可能使用文件组)
  2. 如果我删除node_modules目录,则bazel执行将在此之后停止工作。感觉好像没有必要再次执行“ npm install”。我想念什么?
  3. 如果我不更改package.json而是向index.js添加更多代码,那么后续的构建是否足够聪明,以至于不需要进行“ npm install”操作?

1 个答案:

答案 0 :(得分:0)

  

任何使nodejs_binary散布所有node_module的方法,而不是将它们放入BUILD.bazel文件中并将其列出为“ @ npm // lodash”的方式(例如可能使用文件组)

在rules_nodejs的0.13.0版中不建议使用此行为,推荐的方法 将使用通过yarn_installnpm_install规则设置的细粒度npm依赖项。这有助于减少为目标设置运行文件所需的时间。有关完整示例和说明,请参见文档中node_modules内置规则中的nodejs_binary属性:https://bazelbuild.github.io/rules_nodejs/Built-ins.html

  

如果我不更改package.json而是向index.js添加更多代码,那么后续的构建是否足够智能,以至于无需进行“ npm install”(因为不需要)?

是的,bazel不应运行另一个npm install或为诸如此类的源更改而重建node_module目录。实际上,仅更改js文件中的一行来运行bazel run应该是即时的。