2. 从项目导入到发布
2.1设置项目属性
问题
您要向项目添加额外的属性,或外部化硬编码值。
解
使用ext块作为公共值。要从构建文件中删除它们,请将属性放在gradle.properties文件中,或者使用-P标志在命令行中设置它们。
讨论
Gradle构建文件使用简单的ext语法支持属性定义,在这种情况下,“ext”代表“extra”。这使得可以轻松地定义一个变量值,并在整个文件中使用它。
如果你愿意,这些属性可以硬编码到构建文件中。示例2-1是来自Android Annotations项目的Gradle构建文件的示例。
实例2-1。示例“extra”属性
这里使用def关键字意味着这是当前构建文件中的局部变量。定义没有def(或任何其他类型)的变量将变量添加为项目对象的属性,使其在此项目及其任何子项目中可用。
ext块中的无类型变量向与该构建相关联的Project实例添加属性。
但是,如果您希望从构建文件中删除实际值,该怎么办?考虑具有登录凭据的Maven存储库,如示例2-2所示。
实例2-2。 Maven仓库凭证
1.硬编码值
您可能不想在构建文件中保留实际的用户名和密码值。而是,将它们添加到项目根目录中的gradle.properties文件,如示例2-3所示。
实例2-3。 gradle.properties文件
login='user'
pass='my_long_and_highly_complex_password'
现在,示例2-2中的凭证块可以用变量替换,如示例2-4所示。
实例2-4。修改Maven仓库删除显式凭据
您还可以通过对gradle使用-P参数来设置命令行上属性的值(示例2-5)。
实施例2-5。运行gradle与-P标志
> gradle -Plogin = me -Ppassword = this_is_my_password assembleDebug
为了演示当您使用多种方法时会发生什么,请考虑如例子2-6中的构建文件。
实施例2-6。使属性动态
1检查项目属性是否存在
2打印属性值的自定义任务
在没有任何外部配置的情况下执行printProperties任务将提供在ext块中设置的值(示例2-7)。
实例2-7。使用ext值运行Gradle的输出
如果在项目根目录中的gradle.properties文件中设置了值,则结果不同(示例2-8和2-9)。
实例2-8。使用gradle.properties设置用户和传递值
user = user_from_gradle_properties
pass = pass_from_gradle_properties
实例2-9。使用gradle.properties中的属性运行Gradle的输出
> ./gradlew printProperties
:app:printProperties
username = user_from_gradle_properties
password = pass_from_gradle_properties
这些值也可以从命令行设置,这取优先级(示例2-10)。
实例2-10。运行Gradle,其属性从命令行设置
> ./gradlew -Puser = user_from_pflag -Ppass = pass_from_pflag printProperties
:app:printProperties
username = user_from_pflag
password = pass_from_pflag
“extras”块,属性文件和命令行标志的组合将有希望给您足够的选择来完成任何你需要的。
2.1设置项目属性
问题
您要向项目添加额外的属性,或外部化硬编码值。
解
使用ext块作为公共值。要从构建文件中删除它们,请将属性放在gradle.properties文件中,或者使用-P标志在命令行中设置它们。
讨论
Gradle构建文件使用简单的ext语法支持属性定义,在这种情况下,“ext”代表“extra”。这使得可以轻松地定义一个变量值,并在整个文件中使用它。
如果你愿意,这些属性可以硬编码到构建文件中。示例2-1是来自Android Annotations项目的Gradle构建文件的示例。
实例2-1。示例“extra”属性
ext {
def AAVersion = '4.0-SNAPSHOT' // change this to your desired version
}
dependencies {
apt "org.androidannotations:androidannotations:$AAVersion"
compile "org.androidannotations:androidannotations-api:$AAVersion"
}
正常Groovy成语在这里应用,意味着变量AAVersion是无类型的,但在赋值时取一个String值,并且该变量被内插到两个Groovy字符串依赖项中。
这里使用def关键字意味着这是当前构建文件中的局部变量。定义没有def(或任何其他类型)的变量将变量添加为项目对象的属性,使其在此项目及其任何子项目中可用。
ext块中的无类型变量向与该构建相关联的Project实例添加属性。
但是,如果您希望从构建文件中删除实际值,该怎么办?考虑具有登录凭据的Maven存储库,如示例2-2所示。
实例2-2。 Maven仓库凭证
repositories {
maven {
url 'http://repo.mycompany.com/maven2'
credentials {
username 'user' //1
password 'password' //2
}
}
}
1.硬编码值
您可能不想在构建文件中保留实际的用户名和密码值。而是,将它们添加到项目根目录中的gradle.properties文件,如示例2-3所示。
实例2-3。 gradle.properties文件
login='user'
pass='my_long_and_highly_complex_password'
现在,示例2-2中的凭证块可以用变量替换,如示例2-4所示。
实例2-4。修改Maven仓库删除显式凭据
repositories {
maven {
url 'http://repo.mycompany.com/maven2'
credentials {
username login //1
password pass //2
}
}
}
1从gradle.properties或命令行提供的变量
您还可以通过对gradle使用-P参数来设置命令行上属性的值(示例2-5)。
实施例2-5。运行gradle与-P标志
> gradle -Plogin = me -Ppassword = this_is_my_password assembleDebug
为了演示当您使用多种方法时会发生什么,请考虑如例子2-6中的构建文件。
实施例2-6。使属性动态
ext {
if (!project.hasProperty('user')) { //1
user = 'user_from_build_file'
}
if (!project.hasProperty('pass')) { //1
pass = 'pass_from_build_file'
}
}
task printProperties() { //2
doLast {
println "username=$user"
println "password=$pass"
}
}
1检查项目属性是否存在
2打印属性值的自定义任务
在没有任何外部配置的情况下执行printProperties任务将提供在ext块中设置的值(示例2-7)。
实例2-7。使用ext值运行Gradle的输出
> ./gradlew printProperties
:app:printProperties
username=user_from_build_file
password=pass_from_build_file
如果在项目根目录中的gradle.properties文件中设置了值,则结果不同(示例2-8和2-9)。
实例2-8。使用gradle.properties设置用户和传递值
user = user_from_gradle_properties
pass = pass_from_gradle_properties
实例2-9。使用gradle.properties中的属性运行Gradle的输出
> ./gradlew printProperties
:app:printProperties
username = user_from_gradle_properties
password = pass_from_gradle_properties
这些值也可以从命令行设置,这取优先级(示例2-10)。
实例2-10。运行Gradle,其属性从命令行设置
> ./gradlew -Puser = user_from_pflag -Ppass = pass_from_pflag printProperties
:app:printProperties
username = user_from_pflag
password = pass_from_pflag
“extras”块,属性文件和命令行标志的组合将有希望给您足够的选择来完成任何你需要的。