1

EDIT ароматизаторов и дорожки:Gradle SourceSets по productFlavor и buildType

В настоящее время у меня есть:

sourceSets.whenObjectAdded { 
    sourceSet -> 
    def sourceData = rootProject.ext[sourceSet.name] 
    sourceSet.java.srcDirs = sourceData.javaDirRelease 
} 

rootProject.ext файл, где все конкретная конфигурация productFlavor определяется следующим образом:

ext{ 
    flavor1 = [ 
     javaDirRelease : ['src/pathToJavaReleaseFiles'] 
     javaDirDebug : ['src/pathToJavaDebugFiles'] 
    ] 
} 

В основной сборке.gradle я также делаю: apply from: 'variants.gradle', который содержит вышеупомянутый ext { } объект.

The sourceSets определены как таковые:

sourceSets { 
    flavor1{} 
} 

Это работает, но я хочу сделать добавить sourceSet специфичную для productFlavor и buildType так:

sourceSet.debug.java.srcDirs = 'src/pathToJavaDebugFiles' 

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

То, что работает для меня это (благодаря этому ответу How can I specify per flavor buildType sourceSets?):

sourceSets { 
    flavor1{ 
     def flavorData = rootProject.ext['flavor1'] 
     release { 
      java.srcDirs = flavorData.javaDirRelease 
     } 
     debug { 
      java.srcDirs = flavorData.javaDirDebug 
     } 
    } 
} 

Однако я очень хотел бы, чтобы это был добавлен динамически, так что я все еще могу сохранить мой конфигурационный файл нетронутым. Моя конфигурация сборки довольно сложная и не такая простая, как описано здесь, поэтому мне не нужно предлагать исходные файлы в папку src/flavor1Debug, потому что эти ресурсы также используются из других продуктов, но это не сработает.

+0

Я все еще не понимаю, что вы хотите здесь ... вы говорите: «Я хочу добавить sourceSet», но фрагмент кода устанавливает java source dirs на существующий sourceSet? Кроме того, у вас есть приложение из файла gradle; что находится в 'variants.gradle'? Это где вы определяете объект ext {}? Тогда откуда берется 'javaDirRelease'? –

+0

Я немного отредактировал ответ, поэтому у вас есть лучшее представление о вариантах.gradle, этот файл просто не содержит путей исходных каталогов. «Add to sourceSet» было семантическим недоразумением, я имел в виду «установить sourceSet». Варианты.gradle содержат объект ext {} yes. – box

ответ

1

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

Таким образом, для решения, для того, чтобы читать источники аромата динамически, я рекомендую двигая структуру доб к чему-то вроде этого:

ext { 
    sources = [ 
     flavor1Debug : ['src/pathToJavaReleaseFiles'] 
     flavor1Release : ['src/pathToJavaDebugFiles'] 
    ] 
} 

Это позволяет читать пути источника и перебирать ключи и значения в project.ext.sources ,

Затем вы можете найти вариант по имени и добавить источники из массива.

applicationVariants.all { variant -> 
     def extraSources = project.ext.sources.get(variant.name) 
     if (extraSources != null) { 
      def extraSourceFiles = extraSources.collect { project.file(it) } 
      def sourceSet = variant.sourceSets.find { it.name == variant.name } 
      sourceSet.java.srcDir extraSourceFiles 
      def dummyTask = project.task("register${variant.name}ExtraSourcesTask") 
      variant.registerJavaGeneratingTask(dummyTask, extraSourceFiles) 
     } 
    } 

Раздражение с делать это на уровне варианта является то, что вы должны зарегистрировать дополнительные источники, так как вариантный объект в данный момент уже собраны источники из исходных продуктов и набор вкусов. Тем не менее, я думаю, что это, вероятно, наименее инвазивный способ сделать это динамически.

+0

Эй, @saadfarooq, спасибо за ваш ответ. К сожалению, у меня есть, например, 3 аромата и некоторые дополнительные источники e.g NotificationMechanism, AdLibraries. Теперь только 2-й и 3-й ароматы должны включать NotificationMechanism, а 1-й аромат нуждается как в NotificationMechanism, так и в AdLibraries. В моем случае у меня есть 12 ароматов и дополнительные источники, так как вы можете предположить, что сложность установки выше. У меня нет общей идеи о том, как изменить настройку таким образом. – box

+0

Все, что вам нужно сделать, это изменить файл ext gradle немного ... если вы не можете этого сделать, вы застряли с тем, что у вас есть. –