2012-09-11 8 views
17

Tôi sử dụng Play Framework 2.0 (2.0.3). Tôi có một dự án Java và muốn đọc phiên bản ứng dụng (appVersion) được định nghĩa trong Build.scala.Phát Khung 2: Đọc phiên bản ứng dụng được xác định trong Build.scala

Điều tôi đã thấy là có thể đọc một số chi tiết cấu hình nhất định từ đối tượng Application được cung cấp cho Global.java, nhưng không tìm thấy khóa được gọi là appVersion hoặc tương tự.

Trả lời

22

Bạn có thể xác định phiên bản trong application.conf và để Build.scala đọc giá trị. Tôi đã làm điều này với số phiên bản và tên ứng dụng. Các công trình sau đây trong Play 2.0, có một cập nhật solution for Play 2.1.

Trong project/Build.scala, tải cấu hình và nhận được các thuộc tính:

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") 

Trong conf/application.conf xác định các thuộc tính:

app.version = 1.0 
app.name = My Application 

Cuối cùng trong ứng dụng của bạn, nó sẽ có thể truy cập với

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

Cú pháp cấu hình có khá nhiều tính năng, do đó bạn thậm chí có thể phát điên lên nhiều hơn một chút với phiên bản hay ứng dụng tên của bạn:

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

Cảm ơn, Bạn có thể có nghĩa là Build.scala và không phải build.conf? – peter

+0

Có tất nhiên, cảm ơn! Đã sửa lỗi – Kapep

+1

Bất kỳ ý tưởng nào về cách thực hiện tác vụ này trong Play 2.1? Tôi nhận được lỗi giống như người này: http: //stackoverflow.com/questions/14430088/play-framework-2-1-use-play-api-configuration-in-build-scala – takteek

10

Bạn có thể nhận được phiên bản hiện tại của Play bằng cách sử dụng:

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

Xin chào, tôi muốn biết phiên bản của ứng dụng của tôi và không phải là phiên bản của Play. – peter

+0

Xin lỗi, tôi hiểu lầm: - (( –

+0

AFAIK, không thể, vì tệp Build.scala chỉ được sử dụng cho bản dựng, không phải lúc chạy –

15

tôi sử dụng SBT BuildInfo plugin cho mục đích này:

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", 

    ... 

) 

này tạo ra đối tượng org.foo.bar.BuildInfo mà sau đó bạn có thể gọi từ mã nguồn:

org.foo.bar.BuildInfo.version 

Bạn cũng có thể xác định tùy chỉnh các khóa trong bản dựng và thêm chúng vào buildInfoKeys, điều này khá hữu ích nếu bản dựng của bạn trở nên phức tạp hơn.

3

Đây là cách bạn có thể nhận được phiên bản ứng dụng Play và tên ứng dụng quy định tại bạn build.sbt Thông báo

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

này chỉ hoạt động trong chế độ PROD. Trong chế độ dev, SBT chia sẻ một cá thể JVM với ứng dụng và các cuộc gọi đó trả về một cái gì đó khác.

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

Trong trường hợp này Lớp ứng dụng là lớp được xác định trong dự án của bạn. Nó có thể là bất kỳ lớp học nào từ dự án của bạn.

CẬP NHẬT

tôi nhận thấy rằng phương pháp này không làm việc ra khỏi hộp cho Play> = 2.4.x

Để khắc phục vấn đề này thêm để xây dựng của bạn.sbt

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

Hai thuộc tính này sẽ được thêm vào tệp MANIFEST.FM trong phiên bản của bạn để tiêu đề và phiên bản gói có thể được đọc từ mã.

FYI: Tôi sử dụng SBT mẹ đẻ đóng gói

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

Điều này trả lại 2.4.6 (phiên bản Play) cho tôi. – FrEaKmAn

+0

Đảm bảo bạn sử dụng chế độ PROD 'sbt start' và lớp bạn đang sử dụng để lấy gói nằm trong mã của bạn. – maestr0