我正在尝试使用 Bazel 编译基于 dhall-kubernetes 的 dhall 程序以生成 Kubernetes YAML 文件。
使用简单的 bazel 宏在没有 dhall-kubernetes 的情况下进行基本dhall 编译可以正常工作。
我已经做了一个使用 dhall 的依赖解析来下载 dhall-kubernetes 的示例 - 请参见此处。这也有效,但速度很慢(我认为是因为 dhall 分别下载每个远程文件),并且对 bazel 规则执行引入了网络依赖性,我希望避免这种情况。
我首选的方法是使用 Bazel 下载 dhall-kubernetes 的存档发行版,然后让规则在本地访问它(请参阅此处)。我的解决方案需要 Prelude.dhall 和 package.dhall 中的相对路径,以便示例/k8s 包引用 dhall-kubernetes。虽然它有效,但我担心这会破坏 Bazel 沙箱,因为它需要 Bazel 内部使用的文件夹结构的特殊知识。有没有更好的办法?
Prelude.dhall:
../../external/dhall-kubernetes/1.17/Prelude.dhall
工作空间:
workspace(name = "dhall")
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
DHALL_KUBERNETES_VERSION = "4.0.0"
http_archive(
name = "dhall-kubernetes",
sha256 = "0bc2b5d2735ca60ae26d388640a4790bd945abf326da52f7f28a66159e56220d",
url = "https://github.com/dhall-lang/dhall-kubernetes/archive/v%s.zip" % DHALL_KUBERNETES_VERSION,
strip_prefix = "dhall-kubernetes-4.0.0",
build_file = "@//:BUILD.dhall-kubernetes",
)
BUILD.dhall-kubernetes:
package(default_visibility=['//visibility:public'])
filegroup(
name = "dhall-k8s-1.17",
srcs = glob([
"1.17/**/*",
]),
)
示例/k8s/构建:
package(default_visibility = ["//visibility:public"])
genrule(
name = "special_ingress",
srcs = ["ingress.dhall",
"Prelude.dhall",
"package.dhall",
"@dhall-kubernetes//:dhall-k8s-1.17"
],
outs = ["ingress.yaml"],
cmd = "dhall-to-yaml --file $(location ingress.dhall) > $@",
visibility = [
"//visibility:public"
]
)