玩! 2.0框架多模块项目

时间:2012-08-03 11:06:08

标签: scala playframework playframework-2.0 sbt

我需要有两个不同的项目,比如内部和外部,它们使用相同的数据层,我希望避免因干燥原因而复制配置文件。

我查看了http://www.playframework.org/documentation/2.0.2/SBTSubProjects的子项目文档,但文档非常简短。

感谢@Georg Engel

我现在意识到模块化配置的可能性
import sbt._
import Keys._
import PlayProject._

object ApplicationBuild extends Build {

    val appName         = "MyApp"
    val appVersion      = "1.0-SNAPSHOT"

    val appDependencies = Seq(
      // Add your project dependencies here,
    )

    lazy val common = Project(appName + "-common", file("modules/common"))

    lazy val website = PlayProject(
    appName + "-website", appVersion, path = file("modules/website")
    ).dependsOn(common)

    lazy val adminArea = PlayProject(
    appName + "-admin", appVersion, path = file("modules/admin")
    ).dependsOn(common)

    lazy val main = PlayProject(appName, appVersion, appDependencies, mainLang = SCALA).settings(
      // Add your own project settings here      
    ).dependsOn(
    website, adminArea
    )


}

和我所遇到的编译错误只是由于反向路由器(取消路由而不是控制器操作导致这种情况)

3 个答案:

答案 0 :(得分:5)

这是我做和做过的事。我创建了一个multi-module Maven项目,我基本上保留了所有核心可重用代码。

然后对于我的所有其他Web项目(进行WAR的项目),我在某些情况下使用SBT,Gradle甚至Ant和Maven插件。 这些项目拥有自己的配置(如db host和creds)

framework
   - pom.xml
   - db-module
     - pom.xml
     - src/main/resources # possible classpath loading config here
     - etc...
   - mail-module
     - pom.xml
     - etc...
   - service-module
     - pom.xml
     - etc...

其他项目则只依赖于框架和SBT项目(播放2.0),您可以设置它,以便您的一个解析器是本地maven仓库:https://github.com/harrah/xsbt/wiki/Getting-Started-Library-Dependencies

编辑澄清:框架pom.xml是父项目。您可以使邮件模块依赖于db-module,然后在单独的Web应用程序项目中,您可以依赖邮件模块,您将同时获得mail-module和db -module。

很多人把Maven扔在公交车下面但是它仍然比其他任何东西都做得更好。

更多解释:

答案 1 :(得分:2)

我们正在使用这样的子模块(其中“core”是共享子模块):

Build.scala

val coreModule = PlayProject(appName + "-core", "1.0", appDependencies, path = file("modules") / "core")

val main = PlayProject(appName + "-app", appVersion, appDependencies, mainLang = SCALA).settings(
  // Add your own project settings here      
).dependsOn(coreModule).aggregate(coreModule)

不幸的子模块必须存在于项目树下(“../core”,因为路径不可能) - 所以我们使用git子模块将共享模块放入树中:

git submodule add git://git.example.com/modules.git modules

git submodule init

git submodule update

可靠的SVN外部,mercurial子模块等也将完成这项工作。

答案 2 :(得分:1)

生成源树中某个模块的源依赖可以帮助您实现所需的构建:

import sbt._
import Keys._
import PlayProject._

object ApplicationBuild extends Build {

    val appName         = "test"
    val appVersion      = "1.0-SNAPSHOT"

    val appDependencies = Seq(
      // Add your project dependencies here,
    )

    lazy val main = PlayProject(appName, appVersion, appDependencies, mainLang = SCALA).settings(
      // Add your own project settings here      
    ).dependsOn(common)


    lazy val common = RootProject(file("../common")) 


}

您不能将播放项目与其他项目混合,因此您的配置应该是“依赖项”。源依赖项的好处是它们存在于您的项目中(由于SBT的递归性)。如果依赖项的源更改,则主项目将在下次编译时获得更改。

您可以在此处查看我的多模块播放应用的完整结构:https://github.com/un-jon/play2MultiModule