如何在自定义任务中使用来自不同子项目的源?

时间:2015-04-17 11:48:08

标签: sbt

我正在使用sbt 0.13.7。

我想我的问题与this one有点类似。然而,我有一个多项目构建。

让我们说我的项目结构如下:

- A
   - build.sbt
- B
   - build.sbt
build.sbt

B.dependsOn(A)

有没有办法在build.sbt B中使用来自A的来源编写自定义任务?

2 个答案:

答案 0 :(得分:3)

假设AB是完全独立的版本(它不只是multi-project build,因为您有多个.sbt个文件),它就是&#39}仅当您的A版本实际放置在B内时才有可能。


1)如果您需要A源可供B源使用:

- B
   - build.sbt
   - A
     - build.sbt
build.sbt

然后您可以将A的来源描述为常规的B项目,例如:

<强> B / build.sbt

lazy val a = project in "./A"   // or deeply if your sources not in A's root

lazy val b = project in "." dependsOn a

B / A / build.sbt (如果你真的需要在这里单独构建)

lazy val a = project in "."

您可能希望在AB之间与源路径无关的项目定义共享一些插件,然后像:

def a(base: String) = Project(base = base, settings = someAsettings)

您可以使用符号链接(Linux / Mac)组织此类结构:

ln -s ../B A

否则,您需要手动将ApublishLocal)发布到本地ivy存储库并将其用作外部依赖项。

如果您使用Git,只要参与者使用相同的操作系统,符号链接就应be fine。另一种解决方案是git submodulessubtree


2)如果您需要来自A-sources的代码在B-build(而不是B-sources)中可用,那么您需要这样的结构:

- B
   - build.sbt
   - project
     - project
       - A  
     build.sbt

项目内部项目实际上变成了sbt-plugin,因此其代码可用于B.

如果您不想更改结构,那么A应该成为sbt-plugin,您需要将其发布到本地存储库。

答案 1 :(得分:0)

顶级根项目build.sbt中的以下内容如何?

lazy val a = project
lazy val b = project

lazy val printSources = taskKey[Unit]("Prints the sources of A")
printSources := {
  println("== sources of A ==")
  (sources in (a, Compile)).value.foreach(println)
}

执行任务printSources,您应该看到以下内容:

[multi-sbt-project]> printSources
== sources of A ==
/Users/jacek/dev/sandbox/multi-sbt-project/a/hello.scala
[success] Total time: 0 s, completed Apr 18, 2015 11:26:54 AM