4

我正在尝试用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 超集。


我正在使用官方文档中描述的Starlark 的 Bazel java 实现。它是通过以下方式获得的:

  1. 克隆Bazel 存储库
  2. 跑步bazel build //src/main/java/com/google/devtools/starlark:Starlark_deploy.jar
  3. 上面命令的输出是Starlark_deploy.jar
4

1 回答 1

3

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

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

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 会发生重大变化。

于 2019-04-15T11:32:26.157 回答