больше не зависит от

ия прошлого

У меня есть эта библиотека Androidaar что разработчики могут нормально использовать с

compile 'com.companyname.sdk:android-sdk:2.x'

и теперь мы переписываем библиотеку с нуля, чтобы создать V3.

В ходе этой реорганизации нам удалось разбить библиотеку на модули. Таким образом, можно сказать, что на V3 у нас будут следующие артефакты

compile 'com.companyname.sdk:core:3.x'
compile 'com.companyname.sdk:extra_1:3.x'
compile 'com.companyname.sdk:extra_2:3.x'
compile 'com.companyname.sdk:extra_ ....

и это даст структуре gradle следующие модули:

root:
  |- test_app (apk just for testing, not deployed anywhere)
  |- sdk (aka: core)
  |- extra_1
  |- extra_2
  |- extra_ ... etc

для каждогоextra модуль на ихbuild.gradle естьprovided (':sdk') так что можете использовать все отsdk модуль, но на самом деле не скомпилируйте его внутри себя.

но я хотел бы также предоставить легкий путь миграции для существующих приложений хоста. То есть я бы хотел, чтобы на V3 также был следующий артефакт, объединяющийcore а такжеextra_1 (что это в основном то, что в настоящее время на V2).

compile 'com.companyname.sdk:android-sdk:3.0.0'

Это все звучит великолепно в теории, но мне очень тяжело понять, как это выглядит, чтобы позволить мне легко экспортировать все это.

Чего я хочу достичь

Поэтому я хотел бы иметь возможность во время сборки генерировать следующие артефакты:

android-sdk это включает в себя какcore а такжеextra_1coreextra_1... все остальные дополнения

Что я пробовал

добавить дополнительный модуль с именемlegacy, применятьcom.android.library без кода и добавитьcompile project для обоих других модулей. Генерирует пустойaar

добавьте базовые / устаревшие buildTypes с исходными наборами из обоих модулей. Никогда не генерируется 2aar

добавьте основной / устаревший productFlavours с исходными наборами из обоих модулей. Не компилируется, потому что не может найти импорт изsdk которые объявлены вextra_1 (некоторые из которых генерируются во время аннотирования процессором или ломбоком)

добавить основной / устаревший продуктcompile project('extra_1'), Не компилируется, потому что есть циклическая зависимость между sdk и extra_1.

Ответ

Основываясь на ответе Габриель, я закончил копать больше и обнаружил, что вариант создания дополнительного модуля с зависимостями является правильным. Он сгенерирует AAR с пустым манифестом и пустыми классами. Но важная часть - это файл POM, который он сгенерирует и будет содержать правильные зависимости.

Предостережение о подходе находится на конфигурации дляmaven-publish плагин. Обычно вам нуженpublishing объект сpublications иpom.withXml узел. мой был как следующий:

   pom.withXml {
                def root = asNode()
                def license = root.appendNode('licenses').appendNode('license')
                license.appendNode('name', 'The Apache Software License, Version 2.0')
                license.appendNode('url', 'http://www.apache.org/licenses/LICENSE-2.0.txt')
                license.appendNode('distribution', 'repo')
                def dependenciesNode = asNode().appendNode('dependencies')
                configurations.compile.allDependencies.each { dependency ->
                    def dependencyNode = dependenciesNode.appendNode('dependency')
                    dependencyNode.appendNode('groupId', dependency.group)
                    dependencyNode.appendNode('artifactId', dependency.name)
                    dependencyNode.appendNode('version', dependency.version)
                }
            }

Проблема с этим подходом заключается в том, чтоdependency.version (в конце) не указан, и как таковой он генерирует файл POM с<version>unspecified</version>.

Решение там простое, замените опоздание на переменную, имеющуюся в скрипте, с правильным номером версии. Моя выглядела так:

dependencyNode.appendNode('version', "${rootProject.ext.SDK_VERSION}")

Ответы на вопрос(1)

Ваш ответ на вопрос