2015-06-02 6 views
1

Как бы создать один (Gradle) конфигурации для нескольких проектов Android Studio таким образом, что projB зависит от project(':projA') если projA определен, но использует файл в libs/ иначе?Gradle нескольких проектов условного dependencry

Поскольку это может быть задано, в этом случае projA - это SDK; projB - тестовое приложение, предназначенное для демонстрации SDK. Если команда SDK получает отчет об ошибке, она часто включает в себя шаги воспроизведения с использованием projB.

Когда projB команда делает работу, они делают это на RC сборки projA, в то время как команда SDK использует projB, с зависимостью от project(':projA') так, что сеанс отладки может быть запущен.

projB не имеет конкретного определения его зависимости от projA; эта команда берет вывод projA с сервера сборки и переносит его в папку libs/ и имеет зависимость подстановки.

EDIT я, наконец, пошел с этим кодом в замыкании зависимостей, и он работает как шарм:

def sdkRef 

project.getRootProject().allprojects.each { proj -> 
    if (proj.name.equals("Sdk")) { 
     sdkRef = proj; 
     return true; 
    } 
} 

if (sdkRef) { 
    println "SDK present in project; using project reference as dependency" 
    compile sdkRef 
} else { 
    println "SDK is not present in project; using libs/" 
} 

ответ

1

Интересно, если это то, что вы можете сделать с вкусами и строить варианты.

Через код, который вы можете попробовать в файле сборки:

dependencies { 
if (project.getRootProject().findProject(":projectA")) { 
    compile project(":projectA") 
    } else { 
    compile files("libs/projectA.jar") 
    } 
} 

Одна вещь, которую вы должны учитывать, что ваш settings.gradle определяет, какие модули включены в проект. Таким образом, ваши две команды могут иметь разные файлы в любом случае для проекта.

+0

Моя единственная проблема с этим решением заключается в изменении 'projB', где в идеале« build.gradle »проекта не изменится, а определение зависимостей будет в каком-то файле' settings.gradle', но на данный момент это достаточно хорошо , –

+0

Удивительно, если вы можете создать сборку, которая удаляет артефакт, сгенерированный 'projectA', в' projectB/libs', поэтому projectB имеет только зависимость 'lib/ProjectA'. Проблема с этим, конечно, будет инициировать создание, прежде чем B начнет оценивать себя (без изменения B). Вам нужно будет сделать это вручную: \ – loosebazooka

+0

Угадайте, что я не мог добраться до ваших изменений вовремя, в любом случае, возможно, используя project.rootProject.findProject (": projectA") лучше? – loosebazooka

0

Вы можете достичь этого с помощью productFlavors.

Вы просто должны определить:

  • 2 ароматизаторов продукта в projB/build.gradle
  • определенную зависимость для каждого аромата

android { 
    productFlavors { 
     demo{} 
     sdkdev{} 
    } 
    ... 
} 

dependencies{ 
    demoCompile files("libs/projectA.jar") 
    sdkdevCompile project(":projectA") 
    ... 
} 

Строить будет производить 2 файлов APK.

В Android студии, кто-то из демонстрационной команды можно запустить демонстрационный вкус, выбрав «demoDebug» (или «demoRelease») вариант (в сборки Вариант вкладка) и кто-то из SDk команды отберет «sdkdevDebug» вариант.

gradle.settings должен содержать ссылки на projA и projB, но пользователю из демо-команды никогда не придется компилировать projA, потому что демо-образец не имеет никаких зависимостей от него.

+0

Цель состоит в том, чтобы сделать это бесшовным в Android Studio, так что разработчики Dev и демоверсии запускают свои проекты без вмешательства. Имея еще один аромат, нужно больше сообщать команде, что им нужно сделать что-то особенное. –

+0

ok ... но с вашим текущим решением: вы должны сказать одной из команды, чтобы изменить настройки gradle.settings после проверки (+ никогда не комментировать !!!). Решение, которое я предлагаю, является IMO гораздо менее проблематичным: «демо-команда должна использовать демонстрационную сборку, команда sdk должна использовать сборку sdk». – ben75

+0

Нет, мы проверяем сценарии градации на обоих. Это одноразовое редактирование. –

Смежные вопросы