Configuration depending on launch mode

后端 未结 3 620
忘掉有多难
忘掉有多难 2021-02-04 09:22

Play can be launched in dev mode (via run), in production mode (via start) or in test mode. Is there a way to provide a different config file (co

3条回答
  •  甜味超标
    2021-02-04 10:17

    I usually have a base configuration (application.conf) and three extra configs per environment. In Play Framework 2.4 it can be done by extending GuiceApplicationLoader and merging base conf with your environment specific conf. You can go one step forward and provide different guice modules per environment.

    Scala version:

    class CustomApplicationLoader extends GuiceApplicationLoader {
    
        override protected def builder(context: Context): GuiceApplicationBuilder = {
            val builder = initialBuilder.in(context.environment).overrides(overrides(context): _*)
            context.environment.mode match {
                case Prod =>
                    // start mode
                    val prodConf = Configuration(ConfigFactory.load("prod.conf"))
                    builder.loadConfig(prodConf ++ context.initialConfiguration).bindings(new ProdModule());
                case Dev =>
                    // run mode
                    val devConf = Configuration(ConfigFactory.load("dev.conf"))
                    builder.loadConfig(devConf ++ context.initialConfiguration).bindings(new DevModule());
                case Test =>
                    // test mode
                    val testConf = Configuration(ConfigFactory.load("test.conf"))
                    builder.loadConfig(testConf ++ context.initialConfiguration).bindings(new TestModule());
            }
        }
    }
    

    Java version:

    public class CustomApplicationLoader extends GuiceApplicationLoader {
    
        @Override
        public GuiceApplicationBuilder builder(ApplicationLoader.Context context) {
            final Environment environment = context.environment();
            GuiceApplicationBuilder builder = initialBuilder.in(environment);
            Configuration config = context.initialConfiguration();
            if (environment.isTest()) {
                config = merge("test.conf", config);
                builder = builder.bindings(new TestModule());
            } else if (environment.isDev()) {
                config = merge("dev.conf", config);
                builder = builder.bindings(new DevModule());
            } else if (environment.isProd()) {
                config = merge("prod.conf", config);
                builder = builder.bindings(new DevModule());
            } else {
                throw new IllegalStateException("No such mode.");
            }
            return builder.in(environment).loadConfig(config);
        }
    
        private Configuration merge(String configName, Configuration currentConfig) {
            return new Configuration(currentConfig.getWrappedConfiguration().$plus$plus(new play.api.Configuration(ConfigFactory.load(configName))));
        }
    }
    

    Do not forget to include play.application.loader = "modules.CustomApplicationLoader" to your application.conf.

    In lower versions of Play something similar can be achieved by using GlobalSettings class and overriding onLoadConfig. Mind GlobalSettings in Play 2.4 is depracted.

    If you don't like including test.conf and test mocks from TestModule to your production build, you can filter the files with sbt.

提交回复
热议问题