Bazel 如何正确地将Starlark脚本加载到另一个脚本中?
我试图通过以下方式实现一个非常简单的实现: 问候语.bzlBazel 如何正确地将Starlark脚本加载到另一个脚本中?,bazel,buck,skylark,starlark,Bazel,Buck,Skylark,Starlark,我试图通过以下方式实现一个非常简单的实现: 问候语.bzl def greet(): print ("Hello World!") load (":greeting.bzl", "greet") greet() 测试.bzl def greet(): print ("Hello World!") load (":greeting.bzl", "greet") greet() 并以以下方式执行: java-jarstarlark\u deploy.jar test.bz
def greet():
print ("Hello World!")
load (":greeting.bzl", "greet")
greet()
测试.bzl
def greet():
print ("Hello World!")
load (":greeting.bzl", "greet")
greet()
并以以下方式执行:
java-jarstarlark\u 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_归档
和http_文件
)并定义我自己的Starlark超集
我正在为Starlark使用Bazel java实现。它是通过以下方式获得的:
bazel build//src/main/java/com/google/devtools/starlark:starlark_deploy.jar
Starlark_deploy.jar
它没有文档化,因为它不是一个干净或稳定的API。预计API将来会发生变化。要嵌入到另一个工具中,这个工具要成熟得多 也就是说,如果你想进行实验,你可以:
import com.google.devtools.build.lib.syntax.ParserInputSource;
导入com.google.devtools.build.lib.syntax.ParserInputSource;
导入com.google.devtools.build.lib.syntax.StringLiteral;
导入java.util.HashMap;
导入java.util.Map;
公共环境新建环境(地图导入){
返回Environment.builder(易变性)
.useDefault语义()
.setGlobals(Environment.DEFAULT_GLOBALS)
.setEventHandler(打印处理程序)
.setImportedExtensions(导入)
.build();
}
公共环境执行(字符串路径)
抛出InterruptedException、IOException、EvalException{
字符串内容=新字符串(Files.readAllBytes(path.get(path)),字符集);
ParserInputSource输入=ParserInputSource.create(内容,路径片段.EMPTY_片段);
BuildFileAST=BuildFileAST.parseSkylarkFileWithoutImports(输入,打印处理程序);
映射导入=新的HashMap();
for(StringLiteral imp:ast.getRawImports()){
进口,卖出(
imp.getValue(),
扩展(执行(imp.getValue());
}
环境环境=新环境(导入);
总评估(环境);
返回环境;
}
执行后返回环境,因此您可以检查已定义的变量或函数
在上面的示例中,模块在for
循环中逐个加载。您可以像Bazel一样并行地进行评估
正如我前面所说的,期待API中的突破性更改。太好了。我会谨慎考虑在prod中使用它,但我肯定要测试它。我会尝试一下,然后回来接受答案!非常感谢您的帮助:)