Gradle如何配置profile

为了方便地将应用部署到开发、测试以及产品等不同环境上, Gradle提供了几种不同的方式为不同的环境打包,使得不同的环境可以使用不同的配置文件。此外,它还提供了简单的方法,使得我们能够便捷地初始化数据库。

要为不同的环境提供不一样的配置信息,Maven选择使用profile,而Gradle则提供了两种方法为构建脚本提供Properties配置:

第一种方式: properties文件

第一种方式是使用传统的properties文件, 然后在使用Gradle时,通过传入不同的参数加载不同的properties文件。例如,我们可以在项目中提供development.properties、test.properties和production.properties。在项目运行时,使用-Pprofile=development来指定加载开发环境的配置。构建脚本中加载properties文件的代码如下:

ext {
    profile = project['profile']
}
def loadProperties(){
    def props = new Properties()
    new File("${rootProject.projectDir}/config/${profile}.properties")
            .withInputStream {
                stream -> props.load(stream)
            }
    props
}
processResources {
    filesMatching('**/META-INF/*.xml') {
        filter ReplaceTokens, tokens: loadProperties()
    }
}

在运行脚本的时候,传入的-Pprofile=development可以指定使用哪个运行环境的配置文件。代码中使用了project['profile']从命令行里读取-P传入的参数,Gradle会去父项目根目录下的config文件夹中需找对应的properties文件。

第二种方式: config.groovy

另外一种方式就是使用Groovy的语法,定义可读性更高的配置文件。比如可以在项目中定义config.groovy的配置文件,内容如下:

environments {
    development {
        jdbc {
            url = 'development'
            user = 'xxxx'
            password = 'xxxx'
        }
    }
    test {
        jdbc {
            url = 'test'
            user = 'xxxx'
            password = 'xxxx'
        }
    }
    production {
        jdbc {
            url = 'production'
            user = 'xxxx'
            password = 'xxxx'
        }
    }
}

这里定义了三个环境下的不同数据库配置,在构建脚本中使用如下的代码来加载:

ext {
    profile = project['profile']
}
def loadGroovy(){
    def configFile = file('config.groovy')
    new ConfigSlurper(profile).parse(configFile.toURL()).toProperties()
}
processResources {
    filesMatching('**/META-INF/*.xml') {
        filter ReplaceTokens, tokens: loadGroovy()
    }
}

这里在ConfigSlurper的构造函数里传入从命令行里取到的-P的参数。调用loadGroovy方法就可以加载项目根目录下的config.groovy文件,并作为一个Map返回,这样就可以通过jdbc.url来获取url的值。

从可读性以及代码整洁(配置文件也需要代码整洁)而言,我推荐使用第二种方式来配置,因为这种方法具有清晰的结构。如上面的例子,就可以把数据库相关的信息都放在jdbc这个大的节点下,而不用像properties文件这样的扁平结构。但是对于一些已经使用properties文件来为不同环境提供配置信息的遗留项目里,使用properties文件也没有问题。

results matching ""

    No results matching ""