我如何在Gradle中包含属性文件?
例如在Ant中,我可以执行以下操作:
<property file="${basedir}/build.properties" />
你可以使用java语法来做到这一点,例如:
Properties props = new Properties() InputStream ins = new FileInputStream("/path/file.properties") props.load(ins) ins.close()
这应该适用于任何groovy脚本 . 尽管如此,使用闭包或其他一些奇特的捷径可能会有一种更“常规”的方式 .
编辑:“in”是groovy中的保留字 . 变量不能这样命名,将其重命名为“ins”
我实际上建议使用Gradle的默认属性文件 . 如果将 gradle.properties 中的属性放在与 build.gradle 相同的目录中,它们将自动可用 .
gradle.properties
build.gradle
见user guide .
您可能正在寻找的是:
Properties props = new Properties() props.load(new FileInputStream("$project.rootDir/profile/"+"$environment"+".properties")) props.each { prop -> project.ext.set(prop.key, prop.value) }
然后,您的 property 可以通过他们的名字直接访问 . 即:
println "$jdbcURL" println project.jdbcURL
这可能是一个原因(影子?)为什么这样做是个坏主意?不知道为什么它不支持开箱即用,或者可以在其他地方找到 .
要包含.properties文件,您可以使用以下内容:
apply from: "version.properties"
就是这样!
以下是我在Gradle构建的.jar中包含.csv文件的方法:
sourceSets { main { java { srcDir 'src/main/java' output.classesDir = 'build/classes/main' } resources { srcDir 'src/main/resources' include '*.csv' output.resourcesDir = 'build/resources/main' } } }
然后,当我的应用程序加载资源时,这是独立于Gradle完成的 .
使用GRADLE_USER_HOME env变量设置gradle的主目录 . 把gradle.properties文件放在那里并设置参数 .
https://docs.gradle.org/current/userguide/build_environment.html
用户主目录中的属性文件优先于项目目录中的属性文件 .
我一直非常想念Ant的这个功能,尤其是像 work.dir=${basedir}/work 这样的属性替换 . 我使用的一些大型构建为自动化测试执行了大量环境设置,有些任务只需要用户和环境可配置的设置 . 简单的"gradle.properties"是不够的,特别是对于跨多个项目共享的设置 .
work.dir=${basedir}/work
我把一个示例gradle文件放在一起,管理一个合理的属性加载方案:load-properties.gradle . 这使项目可以准确定义它在 default-properties.gradle 文件中使用的属性,并允许用户定义其本地设置以覆盖它们 . 因为读入的"property"文件是gradle脚本,所以可以在其中包含额外的逻辑,并且值不仅限于字符串 .
default-properties.gradle
此外,它允许通过将“-Penv =(env name)”参数传递给gradle来定义要使用的每个环境属性文件(例如“mac”或“jenkins-machine”或“remote”) .
除非您想要将属性添加到项目中,否则接受的答案将起作用,因为这是我将添加我的解决方案的第一个搜索结果,该解决方案适用于gradle 3.x.一个简单的方法是通过 Ant .
ant { property(file: 'properties.file') }
如果您需要将属性转换为Camel Case以便在脚本中轻松访问(请记住基于点的语法预期并且实际对象存在于gradle中):
println "property value:{dot.property.from.file}" //this will fail. def camelCaseProperty = project.getProperties().get("dot.property.from.file") println "camelCaseProperty:${camelCaseProperty}" //this wont fail
如果未指定,则需要默认值:
def propertyWithDefault = project.getProperties().get("dot.property.from.file","defaultValue");
通过使用此方法,至少使用IntelliJ / Android Studio,IDE将链接您的属性文件和gradle脚本并添加完成,引用检查等 .
8 回答
你可以使用java语法来做到这一点,例如:
这应该适用于任何groovy脚本 . 尽管如此,使用闭包或其他一些奇特的捷径可能会有一种更“常规”的方式 .
编辑:“in”是groovy中的保留字 . 变量不能这样命名,将其重命名为“ins”
我实际上建议使用Gradle的默认属性文件 . 如果将
gradle.properties
中的属性放在与build.gradle
相同的目录中,它们将自动可用 .见user guide .
您可能正在寻找的是:
然后,您的 property 可以通过他们的名字直接访问 . 即:
这可能是一个原因(影子?)为什么这样做是个坏主意?不知道为什么它不支持开箱即用,或者可以在其他地方找到 .
对于Gradle 1.x(在Gradle 2.x中弃用)
要包含.properties文件,您可以使用以下内容:
就是这样!
以下是我在Gradle构建的.jar中包含.csv文件的方法:
然后,当我的应用程序加载资源时,这是独立于Gradle完成的 .
使用GRADLE_USER_HOME env变量设置gradle的主目录 . 把gradle.properties文件放在那里并设置参数 .
https://docs.gradle.org/current/userguide/build_environment.html
我一直非常想念Ant的这个功能,尤其是像
work.dir=${basedir}/work
这样的属性替换 . 我使用的一些大型构建为自动化测试执行了大量环境设置,有些任务只需要用户和环境可配置的设置 . 简单的"gradle.properties"是不够的,特别是对于跨多个项目共享的设置 .我把一个示例gradle文件放在一起,管理一个合理的属性加载方案:load-properties.gradle . 这使项目可以准确定义它在
default-properties.gradle
文件中使用的属性,并允许用户定义其本地设置以覆盖它们 . 因为读入的"property"文件是gradle脚本,所以可以在其中包含额外的逻辑,并且值不仅限于字符串 .此外,它允许通过将“-Penv =(env name)”参数传递给gradle来定义要使用的每个环境属性文件(例如“mac”或“jenkins-machine”或“remote”) .
除非您想要将属性添加到项目中,否则接受的答案将起作用,因为这是我将添加我的解决方案的第一个搜索结果,该解决方案适用于gradle 3.x.一个简单的方法是通过 Ant .
如果您需要将属性转换为Camel Case以便在脚本中轻松访问(请记住基于点的语法预期并且实际对象存在于gradle中):
如果未指定,则需要默认值:
通过使用此方法,至少使用IntelliJ / Android Studio,IDE将链接您的属性文件和gradle脚本并添加完成,引用检查等 .