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

Bazel 如何正确地将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

我试图通过以下方式实现一个非常简单的实现:

问候语.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.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中使用它,但我肯定要测试它。我会尝试一下,然后回来接受答案!非常感谢您的帮助:)