Свойства являются ценным инструментом для простой настройки сборок Gradle и среды Gradle . В этом посте я продемонстрирую некоторые из этих подходов для определения свойств, используемых в сборке Gradle .
Gradle поддерживает как свойства проекта, так и системные свойства . Основное различие между ними, которое представляет интерес в этом посте, заключается в том, как к ним осуществляется доступ. Свойства проекта более удобны для прямого доступа по имени, а системные свойства доступны через обычные методы доступа к системным свойствам Java / Groovy.
Передача свойств проекта из командной строки с -P
Один из самых простых подходов для передачи свойств в сборку Gradle — указать свойства проекта с помощью -P из командной строки. Свойства, переданные в сборку с помощью -P
, легко доступны в сборке как свойства проекта и, если позволяет их структура имен, могут быть доступны напрямую как переменные.
Передача системных свойств из командной строки с -D
Как и в случае с другими приложениями Java, системные свойства можно передать в сборки Gradle с помощью -D . Хотя эти системные свойства, предоставляемые сборке Gradle через параметр -D
, всегда доступны сборке Gradle через обычный механизм Java для получения системных свойств , Gradle позволяет указывать свойства проекта в качестве системных свойств. Это делается путем размещения префикса org.gradle.project.
перед названием свойства, желаемого в сборке. Например, если кто-то хочет указать системное свойство с именем name.first
с -D
, которое будет доступно для сборки Gradle, как если бы оно было предоставлено с -P
, человек может предоставить его для сборки Gradle в командной строке как org.gradle.project. name.first
org.gradle.project. name.first
и сборка Gradle увидит его как свойство проекта с именем name.first
.
Передача свойств системы через переменную среды
Любое приложение на Java или Groovy (включая сборку Gradle) может обращаться к переменным среды через System.getenv (String) . Тем не менее, Gradle позволяет получить доступ к переменным среды внутри сборки, как и к другим свойствам проекта, если переменная среды имеет префикс ORG_GRADLE_PROJECT_
. Например, если кто-то хотел, чтобы свойство проекта в сборке Gradle называлось name.last
и хотел предоставить его для сборки через переменную среды, этот человек мог бы объявить переменную среды ORG_GRADLE_PROJECT_name.last
и ее значение было бы доступно для Gradle построить как свойство проекта с именем name.last
.
gradle.properties
Свойства также могут быть предоставлены для сборки Gradle через файл свойств с именем gradle.properties
. Любые свойства, указанные в systemProp.
в начале названия их свойств рассматриваются как системные свойства в сборке Gradle, а другие свойства (без их имен, начинающихся с «systemProp.») рассматриваются как свойства проекта Gradle. Например, если у моего файла gradle.properties есть свойство name.last=Marx
и свойство systemPropr.name.first=Dustin
, свойство name.last
будет видно и доступно в сборке Gradle, как и любое свойство проекта во время его name.first
свойство будет видно и доступно в сборке Gradle, как и любое системное свойство.
Демонстрация / Пример
Каждый из этих типов механизмов определения свойств может быть продемонстрирован на простом примере. Следующая сборка Gradle пытается распечатать различные свойства, которые указываются по-разному.
наращивание properties.gradle
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
task displayProperties << { displaySystemProperties() displayGradleProjectProperties() } def displaySystemProperties() { println "\n=== System Properties ===" println "Favorite Movie (1994): ${System.properties['movie.favorite.1994']}" println "Favorite Movie (1996): ${System.properties['movie.favorite.1996']}" println "Favorite Movie (1997): ${System.properties['movie.favorite.1997']}" println "Favorite Movie (1981): ${System.properties['movie.favorite.1981']}" println "Favorite Movie (2012): ${System.properties['movie.favorite.2012']}" println "Favorite Movie (2013): ${System.properties['movie.favorite.2013']}" } def displayGradleProjectProperties() { println "\n=== Gradle Project Properties ===" println "Favorite Movie (1994): ${getProjectProperty('movie.favorite.1994')}" println "Favorite Movie (1996): ${getProjectProperty('movie.favorite.1996')}" println "Favorite Movie (1997): ${getProjectProperty('movie.favorite.1997')}" println "Favorite Movie (1981): ${getProjectProperty('movie.favorite.1981')}" println "Favorite Movie (2012): ${getProjectProperty('movie.favorite.2012')}" println "Favorite Movie (2013): ${getProjectProperty('movie.favorite.2013')}" } def String getProjectProperty(String propertyName) { String movieTitle = "null" if (hasProperty(propertyName)) { movieTitle = this .properties[propertyName] } return movieTitle } |
Некоторые свойства, которые будут переданы этому сценарию, будут предоставлены в командной строке с -P
, некоторые будут предоставлены в командной строке с -D
, одно будет предоставлено через переменную окружения, а два будут предоставлены через gradle.properties
Файл gradle.properties
в том же каталоге, что и сборка. Этот файл gradle.properties
показан далее.
gradle.properties
1
2
|
movie.favorite. 2013 =Star Trek into Darkness systemProp.movie.favorite. 2012 =Skyfall |
При gradle.properties
файла gradle.properties
две другие интересные части примера — это установка переменной среды. Пример здесь приведен в DOS, но то же самое можно сделать с немного другим синтаксисом в средах Linux. Команда DOS / Windows: set ORG_GRADLE_PROJECT.movie.favorite.1981="Raiders of the Lost Ark"
Для этой демонстрации я буду запускать скрипт сборки Gradle с параметрами -D
и -P
: gradle -b build-properties.gradle displayProperties -Pmovie.favorite.1996="Independence Day" -Dmovie.favorite.1997=Gattaca -Dorg.gradle.project.movie.favorite.1994="Shawshank Redemption"
При запуске вышеперечисленного скрипта сборки Gradle с указанным файлом gradle.properties
, с указанной указанной переменной среды и с только что показанной командой выходные данные выглядят так, как показано на следующем снимке экрана.
Снимок экрана показывает, как свойства отображаются / доступны в сборке Gradle в зависимости от их источника и соглашения об именах. Вкратце, выходные данные демонстрируют следующие «правила» доступности свойств в сборке Gradle:
- Свойства командной строки
-P
являются «свойствами проекта» - Свойства командной строки
-D
— это, за одним исключением, «системные свойства» - Свойства командной строки
-D
которые начинаются сorg.gradle.project.
являются «свойствами проекта» - Свойства, указанные в
gradle.properties
, за одним исключением, являются «свойствами проекта» - Свойства, указанные в
gradle.properties
, начинающиеся сsystemProp.
являются «системными свойствами» - Свойства, указанные в переменной среды, являются, за одним исключением, «системными свойствами»
- Свойства, указанные в переменных среды, начинающихся с
ORG_GRADLE_PROJECT_
являются «свойствами проекта»
Вывод
Gradle предоставляет множество подходов для указания свойств, которые можно использовать для настройки сборки Gradle.