我正在尝试创建一个Bazel规则,该规则将更新
package.json
包装前
npm_package
.
总之,我想
packages/server/package.tpl.json
并创建输出
包.json
我可以依靠的
npm U包
.
我试过很多不同的错误,比如
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
到
包.json
把文件放进去
npm U包
它按预期工作,只是版本不正确。
这个
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