如何读取属性文件并使用项目 Gradle 脚本中的值?

Posted

技术标签:

【中文标题】如何读取属性文件并使用项目 Gradle 脚本中的值?【英文标题】:How to read a properties files and use the values in project Gradle script? 【发布时间】:2016-09-03 06:01:52 【问题描述】:

我正在编写一个 Gradle 脚本,我需要在其中读取 local.properties 文件并使用 build.gradle 中的属性文件中的值。我正在按照以下方式进行操作。我运行了下面的脚本,它现在抛出了一个错误,但它也没有做任何事情,比如创建、删除和复制文件。我试图打印变量的值,它显示了正确的值。

有人可以告诉我这是否是正确的方法吗?我认为另一种方法是在gradle.properties 中定义所有内容并在build.gradle 中使用它。有人可以告诉我如何从build.properties 访问build.gradle 中的属性吗?

build.gradle文件:

apply plugin: 'java'

//-- set the group for publishing
group = 'com.true.test'

/**
 * Initializing GAVC settings
 */
def buildProperties = new Properties()
file("version.properties").withInputStream 
        stream -> buildProperties.load(stream)

//if jenkins build, add the jenkins build version to the version. Else add snapshot version to the version.
def env = System.getenv()
if (env["BUILD_NUMBER"]) buildProperties.test+= ".$env["BUILD_NUMBER"]"
version = buildProperties.test
println "$version"

//name is set in the settings.gradle file
group = "com.true.test"
version = buildProperties.test
println "Building $project.group:$project.name:$project.version"

Properties properties = new Properties()
properties.load(project.file('build.properties').newDataInputStream())
def folderDir = properties.getProperty('build.dir')
def configDir = properties.getProperty('config.dir')
def baseDir  = properties.getProperty('base.dir')
def logDir  = properties.getProperty('log.dir')
def deployDir  = properties.getProperty('deploy.dir')
def testsDir  = properties.getProperty('tests.dir')
def packageDir  = properties.getProperty('package.dir')
def wrapperDir  = properties.getProperty('wrapper.dir')


sourceCompatibility = 1.7
compileJava.options.encoding = 'UTF-8'

repositories 
     maven  url "http://arti.oven.c:9000/release" 
  

task swipe(type: Delete) 
         println "Delete $projectDir/$folderDir"
         delete "$projectDir/$folderDir"
         delete "$projectDir/$logDir"
         delete "$projectDir/$deployDir"
         delete "$projectDir/$packageDir"
         delete "$projectDir/$testsDir"
         mkdir("$projectDir/$folderDir")
         mkdir("projectDir/$logDir")
         mkdir("projectDir/$deployDir")
         mkdir("projectDir/$packageDir")
         mkdir("projectDir/$testsDir")

task prepConfigs(type: Copy, overwrite:true, dependsOn: swipe) 
    println "The name of $projectDir/$folderDir and $projectDir/$configDir"
    from('$projectDir/$folderDir')
    into('$projectDir/$configDir')
    include('*.xml')

build.properties文件:

# -----------------------------------------------------------------
# General Settings
# -----------------------------------------------------------------
application.name  = Admin
project.name = Hello Cool

# -----------------------------------------------------------------
# ant build directories
# -----------------------------------------------------------------
sandbox.dir = $projectDir/../..
reno.root.dir=$sandbox.dir/Reno
ant.dir = $projectDir/ant
build.dir = $ant.dir/build
log.dir  = $ant.dir/logs
config.dir = $ant.dir/configs
deploy.dir  = $ant.dir/deploy
static.dir =  $ant.dir/static
package.dir = $ant.dir/package
tests.dir = $ant.dir/tests
tests.logs.dir = $tests.dir/logs
external.dir = $sandbox.dir/FlexCommon/External
external.lib.dir = $external.dir/libs

【问题讨论】:

Gradle - Include Properties File的可能重复 虽然这个问题可能是重复的,但@blacktide 的回答比Gradle - Include Properties File 中的任何回答都更适合我。 【参考方案1】:

如果使用默认的gradle.properties 文件,您可以直接从build.gradle 文件中访问属性:

gradle.properties:

applicationName=Admin
projectName=Hello Cool

build.gradle:

task printProps 
    doFirst 
        println applicationName
        println projectName
    

如果您需要访问自定义文件,或访问其中包含 . 的属性(看起来您需要这样做),您可以在 build.gradle 文件中执行以下操作:

def props = new Properties()
file("build.properties").withInputStream  props.load(it) 

task printProps 
    doFirst 
        println props.getProperty("application.name")
        println props.getProperty("project.name")
    

查看this section of the Gradle documentation 了解更多信息。

编辑

如果您想动态设置其中一些属性(如下面评论中所述),您可以创建一个 properties.gradle 文件(名称不重要)并在您的 build.gradle 脚本中使用它.

properties.gradle:

ext 
    subPath = "some/sub/directory"
    fullPath = "$projectDir/$subPath"

build.gradle

apply from: 'properties.gradle'

// prints the full expanded path
println fullPath

【讨论】:

我可以直接在 gradle 脚本中访问 projectDir 的值。如果我在属性文件中有这样的值,请告诉我 renosandbox.dir = $projectDir/../.. 我试图在我的任务中的我的 gradle 脚本 def Pathdir = props.getProperty('renosandbox.dir') println "$Pathdir/$folder" 中访问它。你认为它会扩大 ProjectDir 的价值吗?跨度> 不,它不会自动展开。您需要在您的财产前面加上projectDir,如下所示:def pathDir = "$projectDir/$props.getProperty('renosandbox.dir') @Sushant 查看编辑以另一种方式来完成您的要求。 感谢您给了我正确的方向,并为我提供了以各种方式读取属性文件的信息。 谢谢!这帮助我解决了 gradle.properties 文件中缺少的问题,因此我可以从命令行运行它。【参考方案2】:

我们可以使用一个单独的文件(在我的例子中是config.groovy)来抽象出所有的配置。

在这个例子中,我们使用了三个环境,即,

    开发 测试 产品

具有 serverNameserverPortresources 属性。 我们期望第三个属性resources在多个环境中可能相同,因此我们已经抽象出该逻辑并在必要时在特定环境中覆盖: p>

config.groovy

resources 
    serverName = 'localhost'
    serverPort = '8090'


environments 
    dev 
        serverName = 'http://localhost'   
        serverPort = '8080'
    

    test 
        serverName = 'http://www.testserver.com'
        serverPort = '5211'
        resources 
            serverName = 'resources.testserver.com'
        
    

    prod 
        serverName = 'http://www.productionserver.com'
        serverPort = '80'
        resources 
            serverName = 'resources.productionserver.com'
            serverPort = '80'
        
    

属性文件准备好后,我们可以在build.gradle 中使用以下内容来加载这些设置:

build.gradle

loadProperties()

def loadProperties() 
    def environment = hasProperty('env') ? env : 'dev'
    println "Current Environment: " + environment

    def configFile = file('config.groovy')
    def config = new ConfigSlurper(environment).parse(configFile.toURL())
    project.ext.config = config


task printProperties 
    println "serverName:  $config.serverName"
    println "serverPort:  $config.serverPort"
    println "resources.serverName:  $config.resources.serverName"
    println "resources.serverPort:  $config.resources.serverPort"


让我们使用不同的输入集来运行它们:

    gradle -q printProperties

    Current Environment: dev
    serverName:  http://localhost
    serverPort:  8080
    resources.serverName:  localhost
    resources.serverPort:  8090
    

    gradle -q -Penv=dev printProperties

    Current Environment: dev
    serverName:  http://localhost
    serverPort:  8080
    resources.serverName:  localhost
    resources.serverPort:  8090
    

    gradle -q -Penv=test printProperties

    Current Environment: test
    serverName:  http://www.testserver.com
    serverPort:  5211
    resources.serverName:  resources.testserver.com
    resources.serverPort:  8090
    

    gradle -q -Penv=prod printProperties

    Current Environment: prod
    serverName:  http://www.productionserver.com
    serverPort:  80
    resources.serverName:  resources.productionserver.com
    resources.serverPort:  80
    

【讨论】:

【参考方案3】:

另一种方式...在 build.gradle 中:

添加:

classpath 'org.flywaydb:flyway-gradle-plugin:3.1'

还有这个:

def props = new Properties()
file("src/main/resources/application.properties").withInputStream  props.load(it) 
apply plugin: 'flyway'
flyway 
    url = props.getProperty("spring.datasource.url")
    user = props.getProperty("spring.datasource.username")
    password = props.getProperty("spring.datasource.password")
    schemas = ['db_example']

【讨论】:

以上是关于如何读取属性文件并使用项目 Gradle 脚本中的值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 build.gradle 中定义和调用自定义方法

Gradle删除注释并重新格式化属性文件

Gradle 删除注释并重新格式化属性文件

如何使用 Gradle 设置多项目 Grails?

在springboot中,如何读取配置文件中的属性

Shell脚本自动编译打包Gradle项目并docker部署