如何在Scala中设置一个良好的项目,以便根据不同环境使用不同的配置。
我需要针对开发、测试和生产环境具有不同的数据库(类似于Rails中所做的)。
如何在Scala中设置一个良好的项目,以便根据不同环境使用不同的配置。
我需要针对开发、测试和生产环境具有不同的数据库(类似于Rails中所做的)。
application.conf
文件中,然后为其他环境创建一个新的 conf 文件并包含默认文件。application.conf
如下所示:myapp {
server-address = "localhost"
server-port = 9000
some-other-setting = "cool !"
}
那么对于生产环境(PROD),我可以有另一个名为prod.conf
的文件:
include "application"
# override default (DEV) settings
myapp {
server-address = ${PROD_SERVER_HOSTNAME}
server-port = ${PROD_SERVER_PORT}
}
some-other-setting
与DEV中相同)。...
val conf = ConfigFactory.load()
...
要从DEV切换到PROD配置,只需传递一个系统属性,该属性的名称为要加载的配置文件的名称:
java -Dconfig.resource=prod.conf ...
application.conf
将由default加载。使用类型安全的 Config。创建 Config 对象的方式如下:
import com.typesafe.config._
object Config {
val env = if (System.getenv("SCALA_ENV") == null) "development" else System.getenv("SCALA_ENV")
val conf = ConfigFactory.load()
def apply() = conf.getConfig(env)
}
然后在 src/main/resources
文件夹中创建 application.conf
文件:
development {
your_app {
databaseUrl = "jdbc:mysql://localhost:3306/dev_db"
databaseUser = "xxxx"
databasePassword = "xxxx"
}
}
test {
your_app {
databaseUrl = "jdbc:mysql://localhost:3306/test_db"
databaseUser = "xxxxx"
databasePassword = "xxxx"
}
}
现在,你可以在应用程序的任何位置访问配置文件:
Config().getString("your_app.databaseUrl")
如果你已经设置好了环境变量(例如export SCALA_ENV=test
),当你运行应用程序时,它将考虑正确的配置部分。默认是开发环境。
我对Daniel Cukiers的解决方案不满意,因为它不允许使用默认值和覆盖值,所以我做了一些改动来充分利用它们。
您唯一需要配置的是在系统上设置一个环境变量(如果没有设置,则默认为“dev”)
(Java解决方案,与Scala兼容):
import com.typesafe.config.Config;
import com.typesafe.config.ConfigFactory;
public class MyCompanyConfig {
public final static Config base = ConfigFactory.load().getConfig("mycompany");
public final static String environment = System.getenv("ENVIRONMENT") == null ? "dev" : System.getenv("ENVIRONMENT");
/**
* Returns a subtree of the base configuration with environment settings applied.
*
* @param setting The subtree to return config for.
* @return A config with base in given setting, with environment modifications applied.
*/
public static Config load(String setting) {
Config config = base.getConfig(setting);
if (config.hasPath(environment)) {
return config.getConfig(environment).withFallback(config);
}
return config;
}
}
mycompany.module1 {
setting1 : "adefaultvalue"
url : "localhost"
test {
// will be used where ENVIRONMENT="test"
url : "test.mycompany.com"
}
prod {
// will be used where ENVIRONMENT="prod"
setting1 : "changethedefault"
url : "www.mycompany.com"
}
}
使用方法:
Config conf = MyCompanyConfig.load("module1")
fork in run := true
和java -Dconfig.resource=stg.conf
。文件stg.conf位于资源下,但我的配置仍然来自application.conf。还要注意,当我使用:val conf = ConfigFactory.load("stg.conf")
时,我的配置是按照stg.conf加载的。有什么想法吗? - has981