2015-12-04 4 views
0

У меня есть проект Android, управляемый под git. Git имеет 2 ветки (и многое другое .. но важны те два), branch-a & branch-b. Можно ли настроить градлу, чтобы определить, из какой ветви был построен проект, и установить public static String в одном из классов проекта для оценки в зависимости от ветки?Установить статическую переменную из Gradle во время сборки

Спасибо.

ответ

3

Да, вы можете иметь gradle.properties файл в обеих ваших филиалах (вы можете прочитать о свойствах here), containig некоторого свойства, например buildBranchName. Но значение, присвоенное этому свойству, будет отличаться в каждом плече. Например, в brach1 у вас есть файл gradle.properties в том же каталоге, что и ваш build.gradle сценарий и он имеет свойство

buildBranchName=branch1 

внутри. В то же время, gradle.properties файл в branch2 содержит:

buildBranchName=branch2 

Тогда, так как у вас есть андроид проект, вы можете использовать опцию в BuildConfig поколения класса передать эту переменную в вас источники приложений. Вы можете прочитать об этом here, в разделе «Усовершенствование сборки BuildConfig». Все, что вам нужно, чтобы добавить свойство к этому сгенерированного класса для типов сборки, так же, как:

android { 
    ... 
    buildTypes { 
     debug { 
      buildConfigField "String", "BUILD_BRANCH", buildBranchName 
     } 
     ... 
    }  
} 

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

Кроме того, если у кого-то есть проект без андроида, есть plugin, что позволяет делать то же самое для всех java-проектов.

+0

Stanislav, little edit: я могу получить ветку git в build.gradle следующим образом: https://paste.kde.org/ppnxzmgpk, что, кажется, намного лучшее решение. Я не знал о buildConfigField, который делает эту работу. Спасибо! –

+0

@MikhailKrutov yep, вы можете сделать это с помощью функции exec-type, но IMO, иногда это не лучшее решение, поскольку оно зависит от вызова командной строки удаленного процесса и не содержит фиксированного списка имен brach. Но да, в основном это зависит от требований. Например, у меня есть нечто похожее, но с большим количеством филиалов для разных версий и клиентов. В свойствах у нас есть имя клиента, которое одинаково для нескольких блоков, а имена хранятся как фиксированные и не зависят от имени ветви – Stanislav

1

Да, вы можете сделать это, добавив вкус к проекту

например

android { 
    ...... 

    productFlavors { 
     branch1 { 
      buildConfigField("String", "WHICH_BRANCH", "Branch1") 
     } 
     branch2 { 
      buildConfigField("String", "WHICH_BRANCH", "Branch2") 
     } 
    } 
    ......... 
} 

Теперь получить это значение, как это

например

String whichBranch = BuildConfig.WHICH_BRANCH; 

Позволь мне знать, в случае каких-либо проблем

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