Android обработка аннотаций нескольких модулей - PullRequest
4 голосов
/ 28 мая 2020

В нескольких модулях Android обработка аннотаций проекта по-прежнему выполняется как первая задача перед выполнением любой компиляции, а затем запускается полная компиляция. Конечно, это делается для каждого модуля перед тем, как попасть в модуль app.

Представьте себе случай, когда некоторые дочерние модули зависят от других, компиляция завершится неудачно, поскольку зависимый еще не может найти определение для сгенерированных классов в модуле, от которых это зависит просто потому, что они еще не были сгенерированы.

Мне интересно, есть ли способ использовать gradle или что-то еще, чтобы сначала выполнить обработку аннотации всех дочерних модулей, а затем скомпилировать весь проект автоматически c. Это означает, что если у меня есть 3 модуля, давайте назовем их app, services и executors, где services зависит от executors.

Я ищу, чтобы дерево сборки go в следующем порядке:

  1. обработка аннотаций выполняется для всех модулей без компиляции
  2. полный проект затем вызывается компиляция

Я обнаружил, что до сих пор я обнаружил некоторые многообещающие преимущества, используя параметр java compiler's -proc:{none;only}, где значение only должно вызывать обработку аннотации без какой-либо дальнейшей компиляции. Я попытался передать это option своему компилятору, но по-прежнему компиляция идет последовательно дочерний модуль для каждого дочернего модуля.

Есть идеи?

1 Ответ

2 голосов
/ 08 июня 2020

После глубокого исследования этих тем, долгих часов чтения и множества чайных и кофейных чашек, я обнаружил, что настройка моего проекта была не совсем правильной, а также я выяснил, что плагин Kotlin android имеет свои собственный печальный и темный факт, который, я надеюсь, я смогу прояснить в этом самом ответе, так что возьмите чашку чая / кофе и наслаждайтесь чтением.

  1. Есть ли способ запустить компиляцию kotlin дважды? Короткий ответ на это: NO! , это просто связано с тем, что gradle сам имеет график зависимостей Acycli c, что означает, что не должно быть возможности иметь a круговая зависимость, следовательно, задача будет запускаться только один раз при вызове gradle.
  2. Как решить это ограничение? Есть два варианта: либо мы добавляем новый Source set (для android, который будет через добавление нового buildType), либо просто разрушаем чудеса дилеммы курица / яйцо и используем артефакты.

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

Пытаясь прояснить мою проблему, я продолжил свои исследования и спросил у kotlin разработчиков, как это сделать с помощью kotlin плагина gradle. Пожалуйста, найдите ответы здесь

Краткая история: Невозможно напрямую расширить задачу kotlinCompile gradle просто потому, что есть «код вокруг», который инициирует компиляцию . Я имею в виду, конечно, но почему это было так плохо спроектировано? Почему такому красивому языку, как kotlin пришлось ру sh при создании этого специфического c предположительно мощного плагина, и, главным образом, почему его исходные коды с тех пор никогда не обновлялись и не пересматривались?

Чтобы решить эту проблему, используйте их дескриптор KotlinCompilation точку входа. Мне лично не нравится это решение, так как оно ограничивает уровень гибкости, а также еще больше абстрагирует задачу компиляции.

Еще одним многообещающим способом использования gradle был artifacts, когда модуль создает сам себя и создает артефакт. (в нашем случае обычно jar), который будет использоваться другими проектами. Звучит круто, правда? К сожалению, нет возможности добавить эту библиотеку в путь к классам consumers, и компиляция просто не удастся.

Это были мои выводы, пожалуйста, не стесняйтесь обновлять мои знания или исправлять меня, если я ошибочно понимаю что-то.

Удачного кодирования!

...