SBT多项目建设与动态外部项目?

时间:2013-12-04 03:59:21

标签: scala build playframework-2.0 sbt

假设我们有一个SBT项目bar,它依赖于某个工件foo

val bar = Project('bar', file('.')).settings(    
  libraryDependencies += "com.foo" % "foo" % "1.0.0"
)

但是,在某些情况下,我想检查foo的来源并让SBT从我的文件系统而不是已发布的工件加载源代码;这样,我就可以对foo进行本地更改,并立即使用bar对其进行测试,而无需发布任何内容。

val foo = Project('foo', file('foo'))

val bar = Project('bar', file('.')).dependsOn(foo)

我们在spec.json的根文件夹中有一个bar文件,该文件已指定是应该从源使用foo还是作为工件。有没有办法设置我的构建来阅读此文件,并根据dependsOn中的值添加libraryDependenciesspec.json? “

libraryDependencies

执行此操作非常简单
val bar = Project('bar', file('.')).settings(    
  libraryDependencies ++= 
    if (containsFoo(baseDirectory.value / "spec.json")) {
      Seq()
    } else {
      Seq("com.foo" % "foo" % "1.0.0")
    }
)

但是,我们找不到任何方法来设置dependsOn中的“动态”内容,例如阅读baseDirectory SettingKey

2 个答案:

答案 0 :(得分:2)

我们尝试了一些方法,但是我们唯一可以开始工作且感觉不可理解/不可维护的黑客就是添加一个implicit class,为Project添加一个方法可以在本地添加依赖项或作为工件添加依赖项。

实施的伪代码大纲:

implicit class RichProject(val project: Project) extends AnyVal {

  def withSpecDependencies(moduleIds: ModuleID*): Project = {
    // Read the spec.json file that tells us which modules are on the local file system
    val localModuleIds = loadSpec(project.base / "spec.json")

    // Partition the passed in moduleIds into those that are local and those to be downloaded as artifacts
    val (localModules, artifactModules) = moduleIds.partition(localModuleIds.contains)
    val localClasspathDependencies = toClasspathDependencies(localModules)

    project
      .dependsOn(localClasspathDependencies: _*)
      .settings(libraryDependencies ++= artifactDependencies)
  }
}

实际SBT构建中的使用模式非常简单:

val foo = Project("foo", file("foo")).withSpecDependencies(
  "com.foo" % "bar" % "1.0.0",
  "org.foo" % "bar" % "2.0.0"  
)

答案 1 :(得分:0)

Mecha构建自动化SBT插件执行此操作取决于本地文件系统上是否有其他项目。这是一个新项目,因此文档很少,但您可以查看其来源:https://github.com/storm-enroute/mecha