我试着用星云雀做一个非常简单的实现
greeting.bzl
def greet():
print ("Hello World!")test.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_archive和http_file__)并定义我自己的Starlark超集。
我正在为Starlark 正式文件中所述使用Bazel实现。它是通过以下途径获得的:
bazel build //src/main/java/com/google/devtools/starlark:Starlark_deploy.jarStarlark_deploy.jar发布于 2019-04-15 11:32:26
它没有文档化,因为它不是一个干净或稳定的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中会有不同的变化。
https://stackoverflow.com/questions/55666696
复制相似问题