2015-06-11 2 views
12

Воспроизведение может быть запущено в режиме dev (через run), в режиме производства (через start) или в тестовом режиме. Есть ли способ предоставить другой файл конфигурации (conf/application.conf) в зависимости от того, в каком режиме он запускается?Конфигурация в зависимости от режима запуска

+0

Какую версию «Playframework» вы используете? –

+0

@MonCalamari 2.4 atm, будет обновляться до 3.0. – Reactormonk

ответ

16

Обычно у меня есть базовая конфигурация (application.conf) и три дополнительных конфигурации для каждой среды. В Play Framework 2.4 это можно сделать, расширив GuiceApplicationLoader и объединив базовую конфигурацию conf с вашей спецификой среды. Вы можете сделать один шаг вперед и предоставить различные графические модули для каждой среды.

Scala версия:

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 Версия:

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)))); 
    } 
} 

Не забудьте включить в свой play.application.loader = "modules.CustomApplicationLoader"application.conf.

В нижних версиях Play что-то подобное может быть достигнуто с использованием класса GlobalSettings и переопределения onLoadConfig. Ум GlobalSettings в Play 2.4 отстранен.

Если вам не нравится, в том числе и test.conftest mocks из TestModule в производственной сборки, вы можете filter файлы с sbt.

+1

И добавить' play.application.loader = "modules.CustomApplicationLoader" 'в' application.conf'? – Reactormonk

+0

Yup. Для получения дополнительной информации перейдите по ссылке в ответе. –

+0

Я думаю, что политика stackoverflow должна копировать/вставлять вещи, потому что ссылки могут быть мертвыми. – Reactormonk

3

Вы можете установить другой конфигурационный файл, используя один из 3-х способов играть дает вам:

1 - Использование -Dconfig.resource

Он будет искать альтернативный конфигурационный файл в (обычно вы предоставляете эти альтернативные файлы конфигурации в свой каталог conf/conf до ). Игра будет выглядеть в conf/поэтому вам не нужно добавлять conf /.

$/путь/к/бен/-Dconfig.resource = prod.conf

2 - Использование -Dconfig.file

Вы также можете указать другой локальный файл конфигурации не упакованного в артефактами приложения :

$/путь/к/бен/-Dconfig.file =/Opt/CONF/prod.conf

3 - Использование -Dconfig.url

Вы также можете указать файл конфигурации, который будет загружен из любого URL:

$/путь/к/bin/ -Dconfig.url = http://conf.mycompany.com/conf/prod.conf

Checkout больше:

https://www.playframework.com/documentation/2.3.x/ProductionConfiguration

+0

Да, я знаю, как указать конфиги, но я специально ищу, как указать параметры конфигурации в зависимости от 'run' /' start'/'test', например. 'javaOptions in Run' – Reactormonk

0

Эта вещь может быть выполнена путем загрузки файлов конфигурации на основе среды, которая может быть предоставлена ​​через -Dmode=staging/dev/prod, а для загрузки файлов я переопределяю onLoadConfig из GlobalSettings в Global.java.

Java snippet-

@Override 
public Configuration onLoadConfig(Configuration config, File file,ClassLoader classLoader) { 
Configuration updatedConfig = config; 
String mode = config.getString("mode"); 
if (StringUtils.isNotEmpty(mode)) { 
    try { 
    File modeFolder = FileUtils.getFile(file, "conf/" + mode); 
    if (modeFolder.exists()) { 
     play.api.Configuration modeConfig = config.getWrappedConfiguration(); 
     IOFileFilter fileFilter = new WildcardFileFilter("*.conf"); 
     Collection<File> fileList = FileUtils.listFiles(modeFolder, fileFilter, null); 
     for (File confFile : fileList) { 
     modeConfig = modeConfig 
      .$plus$plus(new play.api.Configuration(ConfigFactory.parseFile(confFile))); 

     } 
     updatedConfig = new Configuration(modeConfig); 
    } 
    } catch (Exception e) { 
    Logger.error("Exception while loading configuration for mode : " + mode, e); 
    } 
} else { 
    Logger.error("Please provide mode in which play application has to start (Ex. play -Dmode=<mode>) "); 
} 

Для каждого режима, создайте папку (имя же как окружающая среда) и сохранить окружающую среду конкретной конфигурации в этой папке.

Смежные вопросы