2012-09-11 11 views

risposta

22

È possibile definire la versione in application.conf e lasciare Build.scala leggere il valore. L'ho fatto con il numero di versione e il nome dell'applicazione. I seguenti lavori in Play 2.0, c'è un aggiornamento solution for Play 2.1.

In project/Build.scala, caricare la configurazione e ottenere le proprietà:

val conf = play.api.Configuration.load(new File(".")) 
val appName = conf.getString("app.name").getOrElse("unnamed application") 
val appVersion = conf.getString("app.version").getOrElse("0.0.0") 

In conf/application.conf definire le proprietà:

app.version = 1.0 
app.name = My Application 

Infine nella vostra applicazione sarà accessibile con

Play.application().configuration().getString("app.version") 

La sintassi di configurazione ha abbastanza alcune caratteristiche, così si può anche andare un po 'più pazzo con i vostri nomi di versione o di applicazione:

app { 
    major = 1 
    minor = 2 
    revision = 3 
    version = ${app.major}.${app.minor}.${app.revision} 
    name = My Application ${app.major}.${app.minor} 
} 
+0

Grazie, Probabilmente intendevi Build.scala e non build.conf? – peter

+0

Sì, certo, grazie! Risolto il problema. – Kapep

+1

Qualche idea su come farlo funzionare in Play 2.1? Sto ricevendo lo stesso errore di questa persona: http: //stackoverflow.com/questions/14430088/play-framework-2-1-use-play-api-configuration-in-build-scala – takteek

10

è possibile ottenere la versione attuale del gioco utilizzando:

play.core.PlayVersion.current(); 
+0

Salve, vorrei conoscere la versione della mia applicazione e non la versione di Play. – peter

+0

Mi spiace, ho frainteso: - (( –

+0

AFAIK, non è possibile, dal momento che il file Build.scala è utilizzato solo per la build, non in fase di esecuzione –

15

uso il SBT BuildInfo plugin per questo scopo:

import sbtbuildinfo.Plugin._ 

val main = PlayProject(appName, appVersion, appDependencies, mainLang = SCALA, settings = Defaults.defaultSettings ++ buildInfoSettings).settings(

    buildInfoKeys := Seq[Scoped](name, appVersion, scalaVersion, sbtVersion), 
    buildInfoPackage := "org.foo.bar", 

    ... 

) 

Questo genera un oggetto org.foo.bar.BuildInfo che è quindi possibile chiamare dal codice sorgente:

org.foo.bar.BuildInfo.version 

È anche possibile definire personalizzato chiavi nella build e aggiungili a buildInfoKeys, che è molto utile se la tua build diventa più complessa.

3

In questo modo è possibile ottenere la versione dell'applicazione Play e il nome dell'applicazione definiti nel build.sbt

name := "myApp" 
version :="1.0.4" 

Avviso questo funziona solo in modalità PROD. In modalità dev SBT condivide un'istanza JVM con l'applicazione e tali chiamate restituiscono qualcosa di diverso.

Application.class.getPackage().getImplementationTitle());  // returns "myApp" 
Application.class.getPackage().getImplementationVersion()); // returns "1.0.4" 

In questa classe caso di applicazione è una classe definita nel progetto. Può essere qualsiasi classe dal tuo progetto.

UPDATE

ho notato che questo metodo non funziona out of the box for Gioca> = 2.4.x

Per risolvere il problema aggiungere questo alla tua build.sbt

packageOptions += Package.ManifestAttributes(
    "Implementation-Version" -> (version in ThisBuild).value, 
    "Implementation-Title" -> name.value 
) 

Le due proprietà verrà aggiunta al MANIFEST.FM file nel costruire così il titolo del pacchetto e la versione possono essere letti dal codice.

FYI: Io uso SBT confezionatore nativo

addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.0.3") 
+2

Questo ha restituito 2.4.6 (versione Play) per me. – FrEaKmAn

+0

Assicurati di utilizzare la modalità PROD 'sbt start' e la classe che stai utilizzando per ottenere il pacchetto nel codice. – maestr0

Problemi correlati