我正在使用sbt 0.13.7。
我想我的问题与this one有点类似。然而,我有一个多项目构建。
让我们说我的项目结构如下:
- A
- build.sbt
- B
- build.sbt
build.sbt
和B.dependsOn(A)
。
有没有办法在build.sbt
B
中使用来自A
的来源编写自定义任务?
答案 0 :(得分:3)
假设A
和B
是完全独立的版本(它不只是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 "."
您可能希望在A
和B
之间与源路径无关的项目定义共享一些插件,然后像:
def a(base: String) = Project(base = base, settings = someAsettings)
您可以使用符号链接(Linux / Mac)组织此类结构:
ln -s ../B A
否则,您需要手动将A
(publishLocal
)发布到本地ivy存储库并将其用作外部依赖项。
如果您使用Git,只要参与者使用相同的操作系统,符号链接就应be fine。另一种解决方案是git submodules或subtree。
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