我正在尝试创建一个Bazel规则,该规则将在与package.json
打包之前更新npm_package
中的版本号。
简而言之,我想使用packages/server/package.tpl.json
并创建一个我可以在package.json
中依赖的输出npm_package
。
我尝试了很多不同的选择,其中包括诸如read-only file system
,no such attribute 'out' in 'stamp_package_json' rule
和rule '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