больше не зависит от
ия прошлого
У меня есть эта библиотека 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_1
core
extra_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}")