如何从命令行覆盖grails配置

car*_*mbo 6 grails command-line

我试图dataSource.url从命令行覆盖运行grails的值,例如

grails <set property> dbm-status
Run Code Online (Sandbox Code Playgroud)

我的第一次尝试是使用-D命令行参数

grails -DdataSource.url=jdbc:sqlserver://xx.xx.xx.xx;databaseName=db_name
Run Code Online (Sandbox Code Playgroud)

我试图添加一个额外的配置文件grails.config.locations,从中获取值,System.getProperty但似乎不起作用.

存在一种内置的方式来覆盖命令行中的配置值,否则如何从命令行将参数注入grails配置?

编辑:我不想使用其他环境/数据源来避免数据源配置重复以及为这个新环境配置事物的需要.

Kub*_*uba 2

通过包含以下内容ifDataSource.groovy我可以覆盖 url、密码和用户名属性(如果提供了 url)。(适用于 Grails 2.x)

....
environments {
    development {
        dataSource {
        url = "jdbc:postgresql://localhost/db"
        username = "user"
        password = "pass"
        if (System.properties['dataSourceUrl']) {
            println 'Taking dataSource url, password, username from command line overrides'
            url = System.properties['dataSourceUrl']
            password = System.properties['dataSourcePassword']
            username = System.properties['dataSourceUsername']
        }
    }
}
...
Run Code Online (Sandbox Code Playgroud)

现在,当我运行命令时,将应用覆盖:

grails dev -DdataSourceUrl=newUrl -DdataSourcePassword=newPass -DdataSourceUsername=newUser run-app
Run Code Online (Sandbox Code Playgroud)

不幸的是,如果您希望能够覆盖每个环境,则必须为每个环境块复制此代码。如果您将其拉到根目录,它将无法工作,因为配置合并开始,并且最后一次运行实际上将应用 env {} 块中的内容,而不是系统属性中的内容。

再看一遍,这样的东西看起来更好:

...
   url = System.properties['dataSourceUrl'] ?: 'jdbc:postgresql://localhost/db'
   //and for every property...
...
Run Code Online (Sandbox Code Playgroud)