Scala 玩2.0框架多模块项目

Scala 玩2.0框架多模块项目,scala,playframework,playframework-2.0,sbt,Scala,Playframework,Playframework 2.0,Sbt,我需要有两个不同的项目,比如说内部和外部,它们使用相同的数据层,我希望避免由于干燥的原因复制配置文件 我已经查看了上的子项目文档,但是文档很短 由于@Georg Engel,我现在意识到了模块化配置的可能性 import sbt._ import Keys._ import PlayProject._ object ApplicationBuild extends Build { val appName = "MyApp" val appVersion

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

我已经查看了上的子项目文档,但是文档很短

由于@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
    )


}

我的编译错误仅仅是由于反向路由器(取消路由而不是控制器操作导致的)

以下是我所做和已经做的。我做了一个项目,基本上保留了我所有的核心可重用代码

然后,对于我的所有其他web项目(制造战争的项目),我在某些情况下使用SBT、Gradle,甚至是带有Maven插件的Ant。这些项目有自己的配置(比如db主机和Cred)

其他项目则仅依赖于该框架,对于SBT项目(play 2.0),您可以对其进行设置,以便其中一个解析器是本地maven repo:

编辑澄清:Framework pom.xml是父项目。您可以使邮件模块依赖于db模块,然后在单独的web应用程序项目中,您可以仅依赖于邮件模块,您将获得邮件模块和db模块

许多人将Maven抛在脑后,但它仍然比其他任何东西都能更好地完成多模块项目

更多说明:

  • 在此处下载示例maven pom文件:。。。第七章是多模块设计


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

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子模块等也会完成这项工作

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

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的递归性)。如果依赖项的源发生了更改,那么主项目将在下一次编译时得到更改


您可以在此处查看我的多模块播放应用程序的完整结构:。

如果您希望,请单击“是”。您可以在多模块项目中具有内部模块依赖项。Maven还将阻止您拥有循环依赖关系。我建议您看看我提供的maven doc示例:实际上,这不是我想要的解决方案。我有基于Maven的多模块项目。我的问题相当于conf级别,但没有明确的解释。我正在考虑删除我的答案,因为你完全改变了你的问题6次,我误解了你原来的帖子,所以我得到-1分。如果你想让我保留它,请告诉我。它仍然是相关的。感谢您分享您的知识我不需要一个核心播放项目,而是一个包含配置的sbt独立模块,我可以在我的主项目中导入。免责声明:我们不使用播放数据层。。。应该可以在application.conf unsing“include”core.conf“中包含一个保存共享配置的文件。这是从类路径读取的,因此将其放入核心conf文件夹也可以共享配置。子项目也可以是“常规”(非播放)项目:val foo=project(id=“hello foo”,base=file(“foo”))。只要core.conf位于类路径上,就可以将其包含在application.conf中。据我所知,普通项目不会强制重新加载play应用程序,因为不会自动检测到更改(但此更改适用于2.0.1到2.0.2,因此如果不再更正,请耐心等待),我建议使用聚合。。。公共项目似乎根本没有被编译。你必须在你的子项目中提供一个路由文件,定义你正在使用的路由…聚合和git子模块不能解决问题(尤其是git子模块)。RootProject和项目之间的区别是什么?它只是一种声明“外部”依赖项的方法。它比项目更灵活。(见“项目参考”)。我更困惑了…为什么更“灵活”。您不必在子目录中定义模块。2.外部项目有自己的生命周期,例如,它们的构建不必使用playPlugin。
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")) 


}