问题标签 [starlark]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
bazel - 加载性能
对于(增量)加载性能,我想将一个巨大的(相信我)拆分BUILD.bazel
成更小的.bzl
文件。
.bzl
然后,我计划在每个中都有一个 Macro foo
,其中包含实际的规则调用:
然后BUILD.bazel
我会有(很多)负载,例如:
然后BUILD.bazel
通过以下方式触发规则:
这应该比评估符号内的所有规则更快.bzl
吗?
还是有更好的方法来并行加载所有信息?
bazel - Bazel:输出目录的 genrule
我刚刚开始与 Bazel 合作。所以,我提前道歉,我无法弄清楚这一点。
我正在尝试运行一个命令,将一堆文件输出到一个目录并使该目录可用于后续目标。我有两种不同的尝试:
- 使用一般规则
- 写我自己的规则
我天真地希望只用genrule
. 但是,您似乎不能说“我不确切知道该命令将输出什么”并将目录放在outs
. 现在我正在尝试编写一个可以使用的规则,ctx.actions.declare_directory
但我还没有完全正确。我似乎无法摆脱tools
我的工作空间并进入我的规则。
我的一般尝试看起来像这样:
我的自定义规则尝试如下所示:
然后,为了运行我的doit
规则,我的 BUILD 文件如下所示:
在我的 genrule 中,该命令运行,但它似乎不喜欢我尝试在 中使用目录outs
。在我的自定义规则中,我似乎无法告诉 Bazel 我想./path/to/doit
用作工作区中的工具,例如expected type 'File' for 'tools' element but got type 'list' instead
...
似乎我必须缺少一些基本的东西,因为这肯定是运行命令并将一堆未知内容输出到目录的常见情况?
struct - 带有方法的云雀结构
这是我尝试做的事情,而且效果很好。我觉得它很有用,但感觉就像是 hack,所以我担心它将来会坏掉。
我正在将一个大型项目转换为 Bazel,我们有很多本地包装器,例如:
这需要很多load
命令,这些命令很烦人,并且是重复的错误来源。如果是普通的 Python,我会简单地导入整个模块。但是 Skylark 需要一个一个的加载函数。
我可以使用结构消除对单个负载的需求。
在my.bzl
:
在各种BUILD
文件中:
正如我上面写的,一切都很好。我可以将 if 用于本地规则的包装器,以及各种其他功能。
但是我滥用语言?以后容易坏吗?
谢谢。
python - 工具链没有下载工具
您好我正在尝试为 Fn 项目设置工具链。该方法是为 GitHub 中可用的每个二进制文件设置一个工具链,然后理论上在规则中使用它。
我有一个包含可用二进制文件的通用包:
下载部分如下所示:
然后我像这样设置工具链:
在我的 BUILD 文件中,我调用 setup_toolchains:
通过这个设置,我有一个如下所示的规则:
工作空间:
当我查询不同的二进制文件时,bazel query //tools/bazel_rules/fn/internal/cli:fn_cli_linux_bin
它们在那里但调用bazel build //...
会导致错误,抱怨:
我尝试按照文档中的工具链教程进行操作,但无法正常工作。另一个有趣的事情是我实际上使用的是 mac,所以工具链的兼容性似乎也是错误的。
我在 repo 中使用这个工具链,所以路径会有所不同,但这里是一个 repo,只包含 fn 的东西以便于阅读。
bazel - 如何将 Starlark 脚本正确加载到另一个脚本中?
我正在尝试用Starlark做一个非常简单的实现:
问候语.bzl
测试.bzl
并执行它:
java -jar Starlark_deploy.jar test.bzl
上述调用的结果是:
我的最终目标是拥有自己的 Starlark 引擎,这取决于Starlark_deploy.jar
. 然后,我将利用 Bazel 规则(例如htt_archive
和http_file
)的存在并定义我自己的 Starlark 超集。
我正在使用官方文档中描述的Starlark 的 Bazel java 实现。它是通过以下方式获得的:
- 克隆Bazel 存储库
- 跑步
bazel build //src/main/java/com/google/devtools/starlark:Starlark_deploy.jar
- 上面命令的输出是
Starlark_deploy.jar
bazel - bazel 理论上是否允许 bazel 构建规则中的 http 请求?
是否有可能在 starlarkbuild
规则或通过调用的某些可执行文件编写 http 请求ctx.actions.run
?
我知道它可以用 bazel test
(内部测试运行器)完成,但它可以在构建阶段完成吗?我知道这不利于网络沙盒(但可以说我们将其关闭)
bazel - 如何在 starlark 中实现 local_archive()
我想实现一个starlark存储库规则,它从WORKSPACE目录中获取一个tar.gz(我将文件放在git LFS中)并提取它,然后将提取的内容用作外部存储库(即,提取文件,然后相当于local_repository()
在那个目录上)。
我尝试了以下方法:
但似乎这种方法不起作用,因为 Starlark 存储库规则似乎无法访问 WORKSPACE 目录(?!?)。
我还尝试了https://groups.google.com/forum/m/#!topic/bazel-discuss/UXvp0rksRMM中提到的方法,即:
但这也不起作用:(。
bazel - 如何使用提供的工具而不是规则构建的工具来编写 Bazel 测试规则?
我有一个测试工具(大致是一个差异工具),它接受两个输入,并返回一个输出(两个输入之间的差异)和一个返回码(如果两个输入匹配,则返回 0,否则返回 1)。它是用 Kotlin 构建的,可以//java/fr/enoent/phosphorus
在我的 repo 中找到。
我想编写一个规则来测试某个东西生成的文件是否与存储库中已经存在的参考文件相同。我尝试了一些东西ctx.actions.run
,问题是我的规则已经test = True
设置,需要返回由该规则构建的可执行文件(因此不是为规则提供的工具)。然后,我尝试按照示例将其包装在 shell 脚本中,如下所示:
(phosphorus_compare
只是一个生成实际命令的宏。)
但是,这种方法有两个问题:
- 不能以这种方式声明输出。它与任何行动都没有关联(Bazel 正在抱怨它)。也许我真的不需要为测试声明输出?测试失败时,Bazel 是否使测试文件夹中的任何内容可用?
- 运行该工具所需的运行文件似乎在测试运行时不可用:
java/fr/enoent/phosphorus/phosphorus: line 359: /home/kernald/.cache/bazel/_bazel_kernald/58c025fbb926eac6827117ef80f7d2fa/sandbox/linux-sandbox/1979/execroot/fr_enoent/bazel-out/k8-fastbuild/bin/tools/phosphorus/tests/should_pass.runfiles/remotejdk11_linux/bin/java: No such file or directory
总的来说,我觉得使用 shell 脚本只是添加了不必要的间接性,并丢失了一些上下文(例如工具的运行文件)。理想情况下,我只会使用ctx.actions.run
并依赖它的返回代码,但它似乎不是一个选项,因为测试显然需要生成可执行文件。编写这样一条规则的正确方法是什么?
bazel - 获取声明文件的基目录
有时在我的 bazel 规则中,我需要运行一个生成一堆文件但将它们写入输出目录的工具,并且应该将目录路径用作参数。所以我最终得到了以下模式:
但它感觉非常冗长和丑陋,我找不到任何好的方法来使用规则属性或在分析阶段可用的东西来构建这条路径。有没有简单的方法来实现这一点?
bazel - 从 Bazel 中的目标/提供者列表中提取/收集文件的最有效方法是什么?
随着我的进步,我正在编写一些规则并学习 Starlark。
假设我有自己的提供者:
然后我有一个需要这些的生成器规则:
在我的实现中,我发现我需要做一些解包来获取文件:
有没有更有效的方法来执行收集?
至于我为什么这样做,生成器实际上需要一个特殊的文件列表,如下所示:
FWIW,这是一个如何使用的示例:
a/BUILD
:
b/BUILD
: