【问题标题】:SBT Multi-Project Build with dynamic external projects?使用动态外部项目构建 SBT 多项目?
【发布时间】:2013-12-20 10:03:33
【问题描述】:

假设我们有一个 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)

我们在bar 的根文件夹中有一个spec.json 文件,它已经指定了foo 是应该从源中使用还是作为工件使用。有什么方法可以设置我的构建以读取此文件并根据spec.json 中的值添加dependsOnlibraryDependencies? '

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

【问题讨论】:

标签: scala build playframework-2.0 sbt


【解决方案1】:

我们尝试了几种方法,但我们唯一可以开始工作并且感觉不像是难以理解/不可维护的黑客攻击的唯一方法是添加一个 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"  
)

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2015-03-11
      • 2013-09-28
      • 2014-12-04
      • 2018-11-18
      • 2018-02-26
      • 2021-05-28
      • 2023-04-10
      • 2012-01-07
      • 2013-11-07
      相关资源
      最近更新 更多