gpt4 book ai didi

bazel - 如何将 Starlark 脚本正确加载到另一个脚本中?

转载 作者:行者123 更新时间:2023-12-03 23:52:19 27 4
gpt4 key购买 nike

我正在尝试用 Starlark 做一个非常简单的实现。 :

问候.bzl

def greet():
print ("Hello World!")

测试.bzl
load (":greeting.bzl", "greet")

greet()

并执行它: java -jar Starlark_deploy.jar test.bzl
上述调用的结果是:
file ':greeting.bzl' was not correctly loaded. Make sure the 'load' statement appears in the global scope in your file

我的最终目标是拥有自己的 Starlark 引擎,这取决于 Starlark_deploy.jar .然后,我将利用 Bazel 规则的存在(例如 htt_archivehttp_file )并定义我自己的 Starlark 超集。

我正在使用 Bazel java 实现 Starlark described in the official documentation .它是通过以下方式获得的:
  • 克隆Bazel repository
  • 运行bazel build //src/main/java/com/google/devtools/starlark:Starlark_deploy.jar
  • 上面命令的输出是 Starlark_deploy.jar
  • 最佳答案

    它没有记录,因为它不是一个干净或稳定的 API。期待 future 的 API 变化。要嵌入另一个工具,Go implementation成熟得多。

    话虽如此,如果您想进行实验,您可以:

    import com.google.devtools.build.lib.syntax.ParserInputSource;
    import com.google.devtools.build.lib.syntax.ParserInputSource;
    import com.google.devtools.build.lib.syntax.StringLiteral;
    import java.util.HashMap;
    import java.util.Map;

    public Environment newEnvironment(Map<String, Environment.Extension> imports) {
    return Environment.builder(mutability)
    .useDefaultSemantics()
    .setGlobals(Environment.DEFAULT_GLOBALS)
    .setEventHandler(PRINT_HANDLER)
    .setImportedExtensions(imports)
    .build();
    }

    public Environment execute(String path)
    throws InterruptedException, IOException, EvalException {
    String content = new String(Files.readAllBytes(Paths.get(path)), CHARSET);
    ParserInputSource input = ParserInputSource.create(content, PathFragment.EMPTY_FRAGMENT);
    BuildFileAST ast = BuildFileAST.parseSkylarkFileWithoutImports(input, PRINT_HANDLER);
    Map<String, Environment.Extension> imports = new HashMap<>();
    for (StringLiteral imp : ast.getRawImports()) {
    imports.put(
    imp.getValue(),
    new Environment.Extension(execute(imp.getValue())));
    }
    Environment env = newEnvironment(imports);
    ast.eval(env);
    return env;
    }

    执行后返回环境,因此您可以检查已定义的变量或函数。

    在上面的示例中,模块在 for 中被一一加载。环形。您可以像 Bazel 那样并行进行评估。

    正如我之前所说,预计 API 会发生重大变化。

    关于bazel - 如何将 Starlark 脚本正确加载到另一个脚本中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55666696/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com