Хобрук: Ваш путь к мастерству в программировании

Получение ConventionMapping в пользовательском плагине

Я пишу пользовательский плагин Gradle, который использует мой пользовательский объект расширения. Я понял, что мне нужно использовать соглашениеMapping для ленивой оценки значения объекта расширения из этого ответа SO и форум Gradle.

Проблема возникает, когда я пытаюсь написать свой плагин с помощью обычного API Gradle (не API DSL). Я решил, что хочу сделать это, потому что это более удобно для IDE. Итак, создание задачи выполняется так:

MyTask task = project.tasks.create("mytask", MyTask)
task.?conventionMapping? ..

вместо

project.task(type:MyTask) {
   conventionMapping.field = ..
}

MyTask расширяет DefaultTask, поэтому у него нет поля ConventionMapping. Затем я обнаружил, что часть реализации Task из Java-плагина Gradle является расширением ConventionTask, от которого, как я думал, я должен расшириться, но, к сожалению, эти факты снова меня смущают:

  1. Пакет ConventionTask является внутренним
  2. DefaultTask снабжен аннотацией @NoConventionMapping.

Я также нашел эту тему, в которой говорилось, что я не должен следовать соглашениям. Итак, мой вопрос: является ли ConventionMapping правильным способом написания плагина, использующего расширение? Если да, то как правильно их получить без магии gradle dsl?

19.08.2014

Ответы:


1

Сопоставление соглашений — это самое мощное решение, доступное в настоящее время для решения проблемы «отложенной настройки», но оно считается внутренней функцией. В какой-то момент он уйдет в пользу новой модели конфигурации (которая станет общедоступной функцией). Между тем, еще одно решение проблемы «отложенной конфигурации» — использование обратных вызовов, таких как project.afterEvaluate { ... }.

19.08.2014
  • Мой пользовательский код плагина выглядит очень чистым с решением afterEvaluate. Спасибо, Питер. 19.08.2014
  • Просто чтобы внести ясность, могу ли я считать, что мы должны попытаться не использовать ConventionMapping, поскольку они могут быть удалены в будущем? Кроме того, где я могу получить подробную информацию об этой новой модели конфигурации, доступны ли они в Gradle 2.0? 19.08.2014
  • При использовании внутренних функций применяется обычное использование на свой страх и риск. Сопоставление соглашений определенно исчезнет, ​​поэтому, пока вы можете обходиться без него, не используйте его. Новая модель конфигурации — одна из главных тем 2.x. Это недоступно в 2.0. 19.08.2014
  • @PeterNiederwieser Есть ли план замены conventionMapping? Откладывание чего-либо в afterEvaluate { } приводит к тому, что необходимо помещать туда зависимые вещи. Допустим, мой пользовательский плагин добавляет задачу типа Zip и устанавливает baseName из нее в afterEvaluate со значением, взятым из расширения плагина. Тогда клиентский проект, который использует этот плагин и ссылается на задачу типа myZipTask.archivePath, получит неправильный путь, если только вызов archivePath не будет выполнен также в afterEvaluate. Однако не дело клиента догадываться о таких вещах заранее, не так ли? Любые советы по этому поводу? 21.10.2015
  • @PeterNiederwieser Можете ли вы привести пример, как это сделать, используя 'afterEvaluate{} 18.09.2016
  • Новые материалы

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

    Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
    Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..

    Обзор 20 основных и современных методов работы с массивами в JavaScript
    Вы знаете их всех? В этом коротком посте я покажу сводку методов, доступных в JavaScript для работы с массивами. Я надеюсь, что вы найдете это полезным! В конце поста вы найдете ссылку на..

    Да, но я чувствую необходимость указать, что это или не единственные два.
    Да, но я чувствую необходимость указать, что это или не единственные два. Обучение с подкреплением (в качестве примера) также является важным.

    Получение стоковых обновлений с помощью Python
    Для начинающего финансового аналитика Введение Описание: Этот проект Python создает скрипт для получения текущих обновлений акций с финансового веб-сайта Yahoo. Для этого проекта мы..