Gradle инкрементная задача: сохранить что-то для следующих исполнений - PullRequest
0 голосов
/ 19 января 2020

Я пишу добавочную задачу для компиляции некоторых файлов. Давайте предположим, что это вариант использования: два исходных файла:

  • Main
  • Lib

Main включает Lib . Поэтому, когда Lib модифицируется, Main также необходимо перекомпилировать.


Чтобы решить эту проблему, мне нужно вычислить граф зависимостей. Но я не хочу воссоздавать его каждый раз, когда одно изменение файла (повторное чтение всех файлов, которые мне нужны для компиляции, обходится дорого), я бы хотел хранить его где-нибудь. Итак, вот мой вопрос:

Как лучше хранить некоторые данные между несколькими выполнениями одной и той же задачи в одном проекте?

  • Должен ли я создать файл и сохранить его в каталоге build
    • Как получить доступ к каталогу сборки из моей задачи java?
  • Могу ли я спросить Gradle для хранения Map<String, String> для этого проекта?
  • Или, может быть, есть какой-то волшебный механизм c gradle для настройки обнаружения FileChange?

Моя задача выглядит так:

public abstract class GradleCompile extends DefaultTask
{
    @Incremental
    @PathSensitive(PathSensitivity.NAME_ONLY)
    @InputDirectory
    abstract DirectoryProperty getInputDir();

    @OutputDirectory
    abstract DirectoryProperty getOutputDir();

    @TaskAction
    void compileShader(InputChanges inputChanges)
    {
        final var inputDir = getInputDir();
        final var outputDir = getOutputDir();

        try (final var compiler = ShadercCompiler.newCompiler())
        {
            for (final var change : inputChanges.getFileChanges(inputDir))
            {
                if (change.getFileType() == FileType.FILE)
                {
                    compileFile(compiler, change, outputDir);
                    // => Here, I should recompile the files depending on this one.
                }
            }
        } catch (final Exception e)
        {
            e.printStackTrace();
        }
    }
}
...