如何在SBT中管理可变的子项目位置?

scand1sk

我尝试将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"))
}

(我不确定在这里是否使用ProjectRootProject是正确的,但是它基本上是从命令行和Eclipse编译的。)

只要项目A在〜/ workspace / a中并且项目B在〜/ workspace / b中,它就可以在我的开发工作站上正常工作

但是,在我的持续集成服务器Jenkins上不是这样,A的源文件位于〜/ jobs / A / workspace中,而B的源文件位于〜/ jobs / B / workspace中

我最近从Maven切换到SBT,它曾经与Maven一起使用(无论如何我还是不记得该如何做,但是我相信我实际上可以引用Maven本地存储库中的源目录)。

也许更多的上下文会有所帮助:B是A所使用的文件格式的解析器,并可能是其他使用相同文件格式标准的项目的解析器。

如何处理这种情况?

杰西克·拉斯考斯基(Jacek Laskowski)

答案将与@AldoStracquadanio已发布的答案非常相似,但是仅利用build.sbt(而不是project/*.scala文件)中的多项目定义,这是sbt 0.13中的新功能

期望是(我从问题和评论中收集了它们,并引用了这些内容而未做任何更改):

  1. “我尝试将SBT与一个主项目A和一个子项目B一起使用。A取决于B”“ B是A使用的文件格式的解析器,可能还有其他使用相同文件格式标准的项目的解析器。 ”
  2. “在我的持续集成服务器Jenkins上不是这种情况”
  3. “我主要从事B方面的工作,但我想从A进行大多数测试(包括测试B的API的可用性)”
  4. “ B应该单独打包和分发(如果可能,请包括源代码)”
  5. “也许可以将两个项目收集在同一个存储库中。”
  6. “如果我在B中执行代码更改,A不会意识到这一点”

使用它们,这是我的解决方案-使用一个目录作为具有两个子项目的顶级根项目-ab

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个项目- rootabtree命令的输出显示之间的依赖关系root,并ab这么好。它们项目聚合,并且在root项目中执行的所有任务都传播到ab

因为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都会通过对项目执行任何任务/命令让别人注意到aa依赖b这解决了要求#3和#6。

Jenkins在新的项目布局上也应该很好,因为它将从SCM存储库中将项目作为单个项目拉出,并针对顶层项目执行必要的命令root,进而将其传播到子项目,b首先之后是a那解决了需求#2和#5。

您可以改用系统属性指向相关项目a和的不同位置b,但是我认为这只会使配置复杂化。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在sbt shell中设置子项目的设置(不使用project命令)?

如何在SBT 0.13中动态获取子项目列表

如何在子项目specs2运行中让sbt使用正确的类加载器?

如何在sbt shell中为所有子项目设置值?

如何在具有多个子项目的SBT项目中覆盖子项目中的设置

在sbt中编译子项目

如何在jar中包含子项目类?

如何在Maven中处理子项目依赖项

如何在Listview中添加子项目和空间

如何在visual studio中隐藏子项目模板?

如何在sbt多项目构建中获取子项目路径

sbt 子项目:dependsOn

如何在子项目中引用自定义SBT设置

播放子项目:如何转换为build.sbt

如何使SBT子项目具有多个Scala版本?

如何在gradle中的所有子项目之前先执行根项目

如何在Gradle多项目构建的子项目目录中执行命令?

如何在多项目Gradle中为子项目定义不同的依赖关系?(Java)

如何在jQuery中序列化多个可排序项目和子项目

sbt:子项目的动态聚合

SBT的子项目内存不足

SBT使用集合创建子项目

如何在另一个子项目的 gradle 任务中从一个子项目调用代码?

如何在Rpres中更改子项目符号字体大小?

如何在不点击的情况下在 Ionic 中实现滑动离子项目?

如何在离子 4 中为离子项目的内容设置块样式?

Maven:如何在父POM中引用子项目的构建目录?

如何在visualstudio 2010解决方案中调试子项目

如何在PhpStorm / WebStorm中调试angular2种子项目?