首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确地将Starlark脚本加载到另一个脚本中?

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

Stack Overflow用户
提问于 2019-04-13 14:44:15
回答 1查看 1.2K关注 0票数 4

我试着用星云雀做一个非常简单的实现

greeting.bzl

代码语言:javascript
复制
def greet():
    print ("Hello World!")

test.bzl

代码语言:javascript
复制
load (":greeting.bzl", "greet")

greet()

并使用:java -jar Starlark_deploy.jar test.bzl执行它。

上述呼吁的结果是:

代码语言:javascript
复制
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实现。它是通过以下途径获得的:

  1. 克隆巴泽尔储存库
  2. 运行bazel build //src/main/java/com/google/devtools/starlark:Starlark_deploy.jar
  3. 上面命令的输出是Starlark_deploy.jar
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-15 11:32:26

它没有文档化,因为它不是一个干净或稳定的API。预期API将来会发生变化。要嵌入到另一个工具中,Go实现要成熟得多。

话虽如此,如果你想做实验,你可以:

代码语言:javascript
复制
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中会有不同的变化。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55666696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档