在Bazel规则中更新package.json版本

时间:2018-10-24 15:47:44

标签: package.json bazel

我正在尝试创建一个Bazel规则,该规则将在与package.json打包之前更新npm_package中的版本号。

简而言之,我想使用packages/server/package.tpl.json并创建一个我可以在package.json中依赖的输出npm_package

我尝试了很多不同的选择,其中包括诸如read-only file systemno such attribute 'out' in 'stamp_package_json' rulerule 'package_json' has file 'package.json' as both an input and an output之类的错误以及当前错误The following files have no generating action: packages/server/package.json

我的项目结构如下:

/
  /packages
    /server
      /src
        BUILD.blaze
      BUILD.blaze
      package.tpl.json
  /tools
    /npm
      BUILD.blaze
      stamp_package_json.bzl

这是一个monorepo,因此与服务器相比,它具有更多的软件包。

packages/server/BUILD.blaze中,我使用两个规则:

package(default_visibility=["//visibility:public"])
load("@build_bazel_rules_nodejs//:defs.bzl", "npm_package")
load("//tools/npm:stamp_package_json.bzl", "stamp_package_json")

stamp_package_json(
    name = "package_json",
    package_json = "package.tpl.json",
    out = "package.json"
    )

npm_package(
    name = "red-server_package",
    deps = [
        ":package_json",
        "//packages/server/src:shared-red-server-library"
    ],
    replacements = {"//packages/": "//"},
)

如果我将package.tpl.json重命名为package.json,并且只是将该文件包含在npm_package中,则它会按预期工作,但版本不正确。

stamp_package_json规则在tools/npm/stamp_package_json.bzl中定义:

def _impl(ctx):
    package_json = ctx.file.package_json

    # The command may only access files declared in inputs.
    ctx.actions.run_shell(
        inputs = [package_json],
        outputs = [ctx.outputs.executable],
        arguments=[package_json.path],
        progress_message = "Stamping package.json file %s" % package_json.short_path,
        command="jq '.version=\"123\"' $1 > $@")

stamp_package_json = rule(
    implementation=_impl,
    executable = True,
    attrs = {
        "package_json" : attr.label(allow_single_file=True),
        "out": attr.output(mandatory = True)
    }
)

如上所述,它当前会引发错误:

The following files have no generating action: packages/server/package.json

我似乎无法弄清楚该如何处理。或者,如果我的方法是好的。或者,如果可以通过其他任何方式实现。

编辑:写了一篇有关我最终解决方案的博客文章:https://medium.com/red-flag/developer-diary-day-1-bazel-build-system-with-monorepo-and-typescript-6f7a5a0a2b00

0 个答案:

没有答案