Как правильно загрузить скрипт Starlark в другой? - PullRequest
1 голос
/ 13 апреля 2019

Я пытаюсь сделать очень простую реализацию с 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. Затем я воспользуюсь существованием правил Базеля (таких как htt_archive и http_file) и определю свой собственный надмножество Starlark.


Я использую Java-реализацию Bazel для Starlark , описанную в официальной документации . Получено:

  1. Клонирование Хранилище Базеля
  2. Бег bazel build //src/main/java/com/google/devtools/starlark:Starlark_deploy.jar
  3. Вывод команды выше равен Starlark_deploy.jar

1 Ответ

2 голосов
/ 15 апреля 2019

Это не задокументировано, потому что это не чистый или стабильный 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;
  }

Returnsсреда после выполнения, поэтому вы можете проверить переменные или функции, которые были определены.

В приведенном выше примере модули загружаются один за другим в цикле for.Вы можете выполнять оценку параллельно, как это делает Базель.

Как я уже говорил, ожидайте серьезных изменений в API.

...