我尝试将SBT与一个主项目A和一个子项目B一起使用。A取决于B。
我很难找到使用SBT文档的方法。无论如何,我以以下A / project / B.scala文件结束:
object B extends Build {
lazy val root = Project(id = "a", base = file(".")) dependsOn (b)
lazy val b = RootProject(file("../b"))
}
(我不确定在这里是否使用Project
和RootProject
是正确的,但是它基本上是从命令行和Eclipse编译的。)
只要项目A在〜/ workspace / a中并且项目B在〜/ workspace / b中,它就可以在我的开发工作站上正常工作
但是,在我的持续集成服务器Jenkins上不是这样,A的源文件位于〜/ jobs / A / workspace中,而B的源文件位于〜/ jobs / B / workspace中
我最近从Maven切换到SBT,它曾经与Maven一起使用(无论如何我还是不记得该如何做,但是我相信我实际上可以引用Maven本地存储库中的源目录)。
也许更多的上下文会有所帮助:B是A所使用的文件格式的解析器,并可能是其他使用相同文件格式标准的项目的解析器。
如何处理这种情况?
答案将与@AldoStracquadanio已发布的答案非常相似,但是仅利用build.sbt
(而不是project/*.scala
文件)中的多项目定义,这是sbt 0.13中的新功能。
期望是(我从问题和评论中收集了它们,并引用了这些内容而未做任何更改):
使用它们,这是我的解决方案-使用一个目录作为具有两个子项目的顶级根项目-a
和b
。
jacek:~/sandbox/so/multi-0.13.1
$ tree
.
├── a
├── b
├── build.sbt
└── project
└── build.properties
3 directories, 2 files
a
并且b
是空目录,现在将是主目录的子项目。
build.sbt
如下:
scalaVersion := "2.10.4-RC1"
lazy val root = project in file(".") aggregate (a, b)
lazy val a = project dependsOn b
lazy val b = project
由于项目是独立的,因此可以在其自己的项目中进行配置,从而满足了需求1和项目4的要求build.sbt
。
project/build.properties
如下:
sbt.version=0.13.1
当您启动SBT壳,你结束了3个项目- root
,a
并b
与tree
命令的输出显示之间的依赖关系root
,并a
与b
这么好。它们由项目聚合,并且在root
项目中执行的所有任务都传播到a
和b
。
因为a
取决于b
任何任务的执行顺序,所以它的开始b
和结束a
。您可以通过show [task]
以下方式自己查看compile
:
[root]> show compile
[info] Updating {file:/Users/jacek/sandbox/so/multi-0.13.1/}b...
[info] Resolving org.scala-lang#scala-library;2.10.3 ...
[info] Updating {file:/Users/jacek/sandbox/so/multi-0.13.1/}root...
[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[info] Done updating.
[info] Resolving org.scala-lang#scala-library;2.10.4-RC1 ...
[info] Updating {file:/Users/jacek/sandbox/so/multi-0.13.1/}a...
[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[info] Done updating.
[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[info] Done updating.
[info] a/compile:compile
[info] Analysis:
[info] b/compile:compile
[info] Analysis:
[info] root/compile:compile
[info] Analysis:
[success] Total time: 4 s, completed Jan 4, 2014 6:23:10 PM
与安装,项目中的任何改变b
都会通过对项目执行任何任务/命令让别人注意到a
的a
依赖b
。这解决了要求#3和#6。
Jenkins在新的项目布局上也应该很好,因为它将从SCM存储库中将项目作为单个项目拉出,并针对顶层项目执行必要的命令root
,进而将其传播到子项目,b
首先之后是a
。那解决了需求#2和#5。
您可以改用系统属性指向相关项目a
和的不同位置b
,但是我认为这只会使配置复杂化。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句