2012-03-15 13 views
22

z luzem 1.2, mogę prefiks klawiszy konfiguracji z identyfikatorem ramowej lub w trybie aplikacji w następujący sposób:Jak zarządzać application.conf w kilku środowiskach przy użyciu play 2.0?

# Production configuration 
%prod.http.port=80 
%prod.application.log=INFO 
%prod.application.mode=prod 

Ale nie wydaje się do pracy z 2.0.

Czy istnieje sposób, aby to zadziałało?

+0

[tutaj jest SO link] (http://stackoverflow.com/a/35324046/492918) do roztworu z użyciem Play2.4.6 Java – guleryuz

Odpowiedz

6

Musisz określić inny plik konfiguracyjny z odpowiednimi właściwościami

http://www.playframework.org/documentation/2.0/Configuration

Istnieje również mechanizm integracji, który pomaga określić wartości domyślne w application.conf i nadpisuje tylko to, co jest potrzebne do produkcji

+0

Well, Spróbuję tego. Dzięki! – tototoshi

+2

Próbowałem to zrobić, jedyny problem z tym, że mam do czynienia, gdy mam 'db.default.driver, db.default.url, db.default.user, etc' zarówno w' application.conf' i 'prod. conf', jakiś powód z prod.conf nigdy się nie łączy. Ale kiedy USUŃ ustawienia db z pliku application.conf i uruchom prod.conf, to działa. Czy istnieje ku temu powód? – KVISH

+1

btw, mam 'prod.conf' w tym' application.conf' – KVISH

13

Mam również to pytanie od dłuższego czasu, a poniżej jest najlepsze podejście, jakiego nauczyłem się do tej pory, otrzymałem podpowiedź, gdy zadaję podobne pytanie w grupie google 2 Play.

W application.config użyć następującej składni, aby zastąpić wartość parametru konfiguracyjnego, gdy system jest obecny:

# Local machine fallback URI 
mongodb.uri="mongodb://192.168.56.101:27017/application" 
# Env variable override 
mongodb.uri=${?MONGOLAB_URI} 

Znak zapytania oznacza, że ​​nie zastępują ze zmienną env jeśli nie jest zestaw. Jeśli użyjesz $ {MONGOLAB_URI}, spodziewasz się, że zmienna zostanie ustawiona i, jak przypuszczam, otrzymasz wyjątek, jeśli nie jest ustawiony.

Dla kompletności, tutaj jest przykładem, jak chcesz odczytać wartość:

lazy val mongoUri = current.configuration.getString("mongodb.uri").getOrElse("mongodb:///") 

Z takim podejściem jest jedna uwaga: upewnij się zachować konfigurację systemu param w SCM pewnego rodzaju.

+0

Cześć Magnus - w jaki sposób utworzyć nowy env var w pliku 'application.conf', który jest równy' mongodb.uri', ale z dodanym '/ a.xml'? –

+0

@KevinMeredith: Wiem, że jest to * bardzo * stary komentarz, ale ... możesz użyć czegoś takiego jak 'my_new_cfg = $ {mongodb.uri}"/a.xml "'. Jest to, oczywiście, przy założeniu, że używasz formatu HOCON do konfigurowania typesafe. –

0

Po prostu mamy wiele plików application.conf, domyślnie jest używany podczas programowania i mamy prod-applicaton.conf, który po prostu kopiujemy na miejsce podczas wdrażania.

+0

działa to dobrze, ale wymaga to zespołu, aby oba te pliki były zsynchronizowane ze sobą. –

43

Gra 2 nie zmusza do użycia żadnej konkretnej metody do zarządzania otoczeniem. Ale zapewnia potężne i elastyczne narzędzia do samodzielnego wdrożenia zgodnie z potrzebami twojego projektu.

Na przykład wspólny wzorzec zachowuje wspólne ustawienia środowiska w jednym pliku i posiada nadpisania specyficzne dla środowiska w innych plikach. Aby to zrobić, będziesz potrzebował custom Global object (możesz umieścić go bezpośrednio w ./app/Global.scala). Poniższy kod jest ważny jako of Play 2.1.1 Scala (2.10):

import java.io.File 
import play.api._ 
import com.typesafe.config.ConfigFactory 

object Global extends GlobalSettings { 
    override def onLoadConfig(config: Configuration, path: File, classloader: ClassLoader, mode: Mode.Mode): Configuration = { 
    val modeSpecificConfig = config ++ Configuration(ConfigFactory.load(s"application.${mode.toString.toLowerCase}.conf")) 
    super.onLoadConfig(modeSpecificConfig, path, classloader, mode) 
    } 
} 

Teraz można umieścić application.dev.conf, application.test.conf i application.prod.conf do swojej ./conf ze środowiskiem określone przesłonięcia (przy zachowaniu typowych ustawień w application.conf).

W tym przykładzie polegamy na własnej grze mode, która zwykle ma sens, ale możesz być tak ziarnisty, jak chcesz i używać zmiennych środowiskowych lub cokolwiek chcesz.

Zobacz także: Typesafe Config

+0

Fantastyczne! Dziękuję Ci. –

+0

Wydaje się, że to nie działa dla mnie. Kiedy używam tego kodu, wszystko, co nie jest ustawione w pliku przesłaniania trybu, wydaje się być ustawione jako domyślne Play, a nie w pliku application.conf. Używam 'play 2.2.1 zbudowanego ze Scala 2.10.2 (z uruchomionym językiem Java 1.7.0_45)'. Czy ktokolwiek inny może potwierdzić to zachowanie? Myślę, że ma to związek z 'ConfigFactory.load'. – mushroom

+0

Przeglądając dokumentację dla ConfigFactory, widzę to dla ConfigFactory.load (String): 'Ładuje konfigurację aplikacji z podanego zasobu klasy classpath lub klasy katalogowej klasy Classpath, umieszcza ją między domyślną konfiguracją odniesienia i domyślnymi przesłonięciami, a następnie rozwiązuje ją." – mushroom

1

Używam tego rozwiązania:

w application.conf Mam zdefiniowane konfiguracje domyślne, w myUsername.conf podaję domyślnej konfiguracji i nadpisane konfigurację konkretnego użytkownika:

include "application.conf" 
logger.application=DEBUG 

wówczas Global.java I załadowaniu konfiguracji określonego użytkownika (jeśli istnieje)

public Configuration onLoadConfig(Configuration config, File path, 
     ClassLoader classloader) { 

    String username = System.getProperty("user.name"); 
    File confFile = new File(new File(path, "conf"), username + ".conf"); 

    if (confFile.exists()) { 
     Logger.info("configuration file {} found", confFile.getName()); 
     return new Configuration(ConfigFactory.load(confFile.getName())); 
    } else { 
     Logger.info(
       "configuration file {} not found, using default application.conf", 
       confFile.getAbsolutePath()); 
     return null; 
    } 

} 
4

Jeśli chcesz zachować niezależność od ograniczonych trybów Scala Run, możesz użyć właściwości JVM. Put zmodyfikowany @coffesnake przykład ./app/Global.scala:

import java.io.File 

import play.api._ 
import com.typesafe.config.ConfigFactory 

object Global extends GlobalSettings { 
    override def onLoadConfig(config: Configuration, path: File, classloader: ClassLoader, mode: Mode.Mode): Configuration = { 
    val environment = System.getProperty("environment") 
    val environmentSpecificConfig = config ++ Configuration(ConfigFactory.load(s"application.${environment}.conf")) 
    super.onLoadConfig(environmentSpecificConfig, path, classloader, mode) 
    } 
} 

Następny bieg zabaw play

i uruchomić aplikację ze środowiskiem param run -Denvironment=prod-server1

nie przyłączają zarówno polecenia, to nie robi 't work then

Konfiguracja globalna zostanie zastąpiona właściwościami właściwymi dla środowiska z pliku:

./conf/application.prod-server1.conf 

EDIT:

Z perspektywy czasu widziałem tego obejścia jest niepotrzebna. Lepiej jest używać play wbudowany mechanizm config ładunkowej -Dconfig.file=/etc/play-application/foo-production.conf

Powiązane problemy