【问题标题】:Play! 2.0 framework multi Module project玩! 2.0框架多Module项目
【发布时间】:2012-08-01 10:19:18
【问题描述】:

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

我查看了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
    )


}

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

【问题讨论】:

  • 我推荐使用aggregate...常见的项目好像根本没有编译。你必须在你的子项目中提供一个路由文件,定义你正在使用的路由......
  • 聚合和 git 子模块并不能解决问题(尤其是 git 子模块)。

标签: scala playframework playframework-2.0 sbt


【解决方案1】:

这是我所做的和已经做过的。我做了一个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 项目(play 2.0),您可以对其进行设置,以便您的解析器之一是本地 maven 存储库:https://github.com/harrah/xsbt/wiki/Getting-Started-Library-Dependencies

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

许多人将 Maven 抛在了身后,但它仍然比其他任何东西都做得更好。

更多解释:

【讨论】:

  • 如果你想要它,那么是的。您可以在多模块项目中拥有内部模块依赖项。 Maven 也会阻止你产生循环依赖。我建议您查看我提供的 Maven 文档示例:sonatype.com/books/mvnex-book/reference/multimodule.html
  • 这不是我实际寻找的解决方案。我有基于 Maven 的多模块项目。我的问题是在 conf 级别 playframework.org/documentation/2.0/Configuration 但没有明确的解释
  • 嗯,我正在考虑删除我的答案,因为你完全改变了你的问题 6 次,我误解了你的原始帖子,所以我得到了 -1。如果您希望我保留它,请告诉我。
  • 它仍然相关。感谢您分享您的知识
【解决方案2】:

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

构建.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 子模块等也可以完成这项工作。

【讨论】:

  • 我不需要核心 play 项目,而是需要一个 sbt 独立模块,其中包含我可以在我的主项目中导入的 conf。
  • 免责声明:我们没有使用播放数据层......应该可以在您的 application.conf 中包含一个包含共享配置的文件,取消“包含“core.conf””。这是从类路径中读取的,因此将其放入您的 core-conf-folder 中,您也可以共享配置。
  • 子项目也可以是“常规”(非播放)项目:val foo = Project(id = "hello-foo", base = file("foo"))。只要 core.conf 在类路径中,您就可以将它包含在 application.conf 中。据我所知,我的一个普通项目不会强制重新加载播放应用程序,因为不会自动检测到更改(但这已更改为 2.0.1 到 2.0.2,所以如果不再更正,请耐心等待)
【解决方案3】:

对位于源树中某处的模块的源依赖可以帮助您实现所需的构建:

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

【讨论】:

  • RootProject和Project有什么区别?
  • 这只是一种声明“外部”依赖的方式。它比 Project 更灵活。 (见github.com/harrah/xsbt/wiki/Full-Configuration(在“项目参考”)。
  • 我更糊涂了……为什么更“灵活”?
  • 1.您不必在子目录中定义模块。 2.外部项目有自己的生命,例如他们的构建不必使用playPlugin。
猜你喜欢
  • 2012-12-17
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
  • 2012-04-25
  • 2015-11-23
  • 2015-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多