2015-06-11 16 views
12

Phát có thể được khởi chạy ở chế độ dev (qua run), ở chế độ sản xuất (qua start) hoặc ở chế độ thử nghiệm. Có cách nào để cung cấp một tệp cấu hình khác (conf/application.conf) tùy thuộc vào chế độ nào được khởi chạy không?Cấu hình tùy thuộc vào chế độ khởi động

+0

Bạn sử dụng phiên bản 'Playframework' nào? –

+0

@MonCalamari 2,4 atm, sẽ nâng cấp lên 3,0 đôi khi. – Reactormonk

Trả lời

16

Tôi thường có cấu hình cơ bản (application.conf) và ba cấu hình phụ cho mỗi môi trường. Trong Play Framework 2.4, bạn có thể thực hiện bằng cách mở rộng GuiceApplicationLoader và hợp nhất cơ sở với conf của môi trường cụ thể của bạn. Bạn có thể tiến lên một bước và cung cấp các mô-đun guice khác nhau cho mỗi môi trường.

Scala phiên bản:

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

phiên bản 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)))); 
    } 
} 

Đừng quên bao gồm play.application.loader = "modules.CustomApplicationLoader" để application.conf của bạn.

Trong các phiên bản thấp hơn của Play, có thể đạt được điều gì đó tương tự bằng cách sử dụng lớp GlobalSettings và ghi đè onLoadConfig. Tâm trí GlobalSettings trong số Play 2.4 bị hủy.

Nếu bạn không thích bao gồm test.conftest mocks từ TestModule vào bản dựng sản xuất của mình, bạn có thể filter các tệp có sbt.

+1

Và thêm' play.application.loader = "modules.CustomApplicationLoader" 'vào' application.conf'? – Reactormonk

+0

Yup. Theo liên kết trong câu trả lời để biết thêm chi tiết. –

+0

Tôi nghĩ rằng chính sách stackoverflow là sao chép/dán những thứ trên vì các liên kết có thể chết. – Reactormonk

3

Bạn có thể đặt một tập tin cấu hình khác nhau sử dụng một trong 3 cách chơi mang đến cho bạn:

1 - Sử dụng -Dconfig.resource

Nó sẽ tìm kiếm một tập tin cấu hình thay thế trong classpath ứng dụng (bạn thường cung cấp các tệp cấu hình thay thế này vào thư mục/thư mục ứng dụng của bạn trước khi đóng gói ). Play sẽ xem xét conf/do đó bạn không phải thêm conf /.

$/path/to/bin/-Dconfig.resource = prod.conf

2 - Sử dụng -Dconfig.file

Bạn cũng có thể chỉ định một tập tin cấu hình địa phương không được đóng gói vào hiện vật ứng dụng :

$/path/to/bin/-Dconfig.file =/opt/conf/prod.conf

3 - Sử dụng -Dconfig.url

Bạn cũng có thể chỉ định một tập tin cấu hình được nạp từ bất kỳ URL:

$/path/to/bin/ -Dconfig.url = http://conf.mycompany.com/conf/prod.conf

Thanh toán thêm về:

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

+0

Có, tôi biết cách chỉ định các cấu hình, nhưng tôi đặc biệt tìm cách chỉ định các tùy chọn cấu hình tùy thuộc vào 'run' /' start'/'test', ví dụ: 'javaOptions trong Run' – Reactormonk

0

Điều này có thể được thực hiện bằng cách tải tệp cấu hình dựa trên môi trường có thể được cung cấp qua -Dmode=staging/dev/prod và để tải các tệp tôi ghi đè onLoadConfig của GlobalSettings trong 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>) "); 
} 

Đối với mỗi chế độ, tạo một thư mục (tên giống như môi trường) và giữ cấu hình cụ thể môi trường trong thư mục đó.

Các vấn đề liên quan