Play! 框架 - 使用 Build.scala 的 build.sbt 文件

4

我希望在我的Play! 2.1应用程序中,将各种设置与构建定义分离。

我将一些设置定义在build.sbt中,如下所示:

name := "My Project"
version := 1.0

我该如何在Build.scala中重复使用这些值?
object ApplicationBuild extends Build {

  val main = 
    // Doesn't compile since name and version are SettingKeys, not Strings
    play.Project(name, version).settings(
      // ...
    )

}

非常感谢!
2个回答

6

如果您需要访问键(如使用<+=代替+=),则可以使用<<=代替:=。在此示例中,我们希望从全局范围中提取版本和名称。

val main = play.Project(appName, appVersion, appDependencies).settings(
  version <<= (version in Global)  { v => v} ,
  name <<= (name in Global) { n => n } 
)

尽管如此,由于这是默认范围,因此在此情况下我们可以省略作用域。
val main = play.Project(appName, appVersion, appDependencies).settings(
  version <<= (version)  { v => v} ,
  name <<= (name) { n => n } 
)

这个的更简短的版本可以写成:
val main = play.Project(appName, appVersion, appDependencies).settings(
  version <<= version ,
  name <<= name
)

请注意,您的build.sbt文件必须放在根目录中而不是project/目录中。

谢谢你的回答!然而这意味着我仍然需要定义appName和appVersion(以便我可以调用play.Project(...))。我不能简单地使用在build.sbt中定义的值吗?另外,如果appName和name被定义为不同的值,哪个会优先生效呢? - user510159
无论应用的哪个设置是最后应用的,都会优先考虑该项目。问题出在 https://github.com/playframework/Play20/blob/master/framework/src/sbt-plugin/src/main/scala/play/Project.scala#L44 - 它设置了版本,这意味着您必须在该代码完成后再次设置它。在这种情况下,appName 和 appVersion 可以只是“blah”,并且将被覆盖。 - Ivan Meredith
好的,谢谢!我接受了你的答案。对我来说,这仍然听起来像那些参数是不必要和令人困惑的。只使用play.Project()(即没有参数)就可以了。 - user510159
@IvanMeredith 有没有可能把你的答案翻译成Java? - Eric Wilson
@EricWilson 我不明白这怎么可能是Java。Play2.x使用的是用Scala构建的sbt。 - Ivan Meredith
@IvanMeredith 是的,我误解了问题。在意识到我的错误后,我问了一个类似但不同的问题:https://dev59.com/jHjZa4cB1Zd3GeqPhsBu - Eric Wilson

1
Build.scala无法访问在build.sbt中定义的值,但反过来可以。你在这里尝试做的事情实际上只是试图黑客SBT 0.12。
我建议你在一个名为Settings.scala的文件中定义共享设置,然后你可以从Build.scala和build.sbt中引用这些共享设置。

Settings.scala

object Settings {
  appName:= "My Project"
  appVersion:= 1.0
}

Build.scala

object ApplicationBuild extends Build {
  val main = play.Project(appName, appVersion, appDependencies)...
}

build.sbt

name := Settings.appName
version := Settings.appVersion

如果您使用SBT 0.13和Play 2.2,故事将会有所不同。:)

如果这样对您更加清晰易懂,请告诉我。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接