Как правильно загрузить скрипт Starlark в другой?
Я пытаюсь сделать очень простую реализацию с Starlark:
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.
Я использую Java-реализацию Bazel для Starlark, описанную в официальной документации. Был получен:
- Клонирование Bazel хранилище
- Бег
bazel build //src/main/java/com/google/devtools/starlark:Starlark_deploy.jar
- Выход команды выше
Starlark_deploy.jar
1 ответ
Это не задокументировано, потому что это не чистый или стабильный 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
петля. Вы можете выполнять оценку параллельно, как это делает Базель.
Как я уже говорил, ожидайте серьезных изменений в API.