SBT dependsOn RootProject:不编译依赖项

Posted

技术标签:

【中文标题】SBT dependsOn RootProject:不编译依赖项【英文标题】:SBT dependsOn RootProject: doesn't compile the dependency 【发布时间】:2013-11-18 21:42:28 【问题描述】:

我有一个非常简单的配置:

  //lazy val bananaRdfProject = RootProject( uri("git://github.com:stample/banana-rdf.git#"+bananaGitBranch) )
  // lazy val bananaRdfProject = RootProject( uri("https://github.com/stample/banana-rdf.git#"+bananaGitBranch) )
  // lazy val bananaRdfProject = ProjectRef( uri("https://github.com/stample/banana-rdf.git#"+bananaGitBranch) ,"banana-rdf")
  lazy val bananaRdfProject = RootProject( file("../banana-rdf") )


  lazy val main = play.Project(appName, appVersion, appDependencies).settings(...)
                     .dependsOn( bananaRdfProject )

我尝试将上述 4 种不同的项目声明用于bananaRdfProject。

由于我可能在本地编辑这个香蕉-rdf,我希望每次构建我的游戏项目时都重新编译它,这样我就不必发布香蕉-rdf...

但是当我尝试编译使用香蕉-rdf 的主播放项目时,它不会编译香蕉-rdf,而是尝试编译主项目:编译失败,因为类路径中缺少香蕉-rdf 类.

sebastien@clemence-XPS-L412Z:rww-play (master *%)$ ./play.old/play
[info] Loading project definition from /home/sebastien/Bureau/rww-play/project
[warn] there were 1 deprecation warning(s); re-run with -deprecation for details
[warn] one warning found
[info] Loading project definition from /home/sebastien/Bureau/banana-rdf/project
[info] Updating file:/home/sebastien/Bureau/banana-rdf/project/banana-rdf-build...
[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[info] Done updating.
[info] Compiling 2 Scala sources to /home/sebastien/Bureau/banana-rdf/project/target/scala-2.10/sbt-0.13/classes...
[warn] there were 11 deprecation warning(s); re-run with -deprecation for details
[warn] there were 2 feature warning(s); re-run with -feature for details
[warn] two warnings found
[info] Set current project to RWWeb (in build file:/home/sebastien/Bureau/rww-play/)
       _
 _ __ | | __ _ _  _
| '_ \| |/ _' | || |
|  __/|_|\____|\__ /
|_|            |__/

play 2.2-TLS built with Scala 2.10.3-RC3 (running Java 1.7.0_45), http://www.playframework.com

> Type "help play" or "license" for more information.
> Type "exit" or use Ctrl+D to leave this console.

[RWWeb] $ compile
[info] Updating file:/home/sebastien/Bureau/banana-rdf/banana...
[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[info] Done updating.
[info] Updating file:/home/sebastien/Bureau/rww-play/RWWeb...
[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[info] Done updating.
[info] Compiling 53 Scala sources and 1 Java source to /home/sebastien/Bureau/rww-play/target/scala-2.10/classes...
[error] /home/sebastien/Bureau/rww-play/app/controllers/CORSProxy.scala:4: object banana is not a member of package org.w3
[error] import org.w3.banana.plantain.Plantain
[error]               ^
[error] /home/sebastien/Bureau/rww-play/app/controllers/CORSProxy.scala:7: not found: type Plantain
[error] object CORSProxy extends org.www.readwriteweb.play.CORSProxy[Plantain](webClient) 
.................

在尝试编译我的主项目之前不应该编译banana-rdf吗?如果不是,那么依赖外部 RootProject 有什么意义?

【问题讨论】:

相关问题***.com/q/20083564/1305344 感谢@JacekLaskowski 【参考方案1】:

RootProject(file("../banana-rdf")) 项目引用只是引用根项目,而您真正需要的是对banana-rdf 子项目(在rdf 子目录中)的引用。

可用的子项目在https://github.com/w3c/banana-rdf/blob/master/project/build.scala 中定义。有几个:

[main]> projects
[info] In file:/Users/jacek/sandbox/***/19832655/
[info]   * main
[info] In https://github.com/w3c/banana-rdf.git
[info]     banana
[info]     banana-jena
[info]     banana-rdf
[info]     banana-rdf-test-suite
[info]     banana-sesame
[info]     examples
[info]     experimental
[info]     ldp
[info]     patch

要引用banana-rdf,您应该使用以下ProjectRef 指向构建配置中的正确模块(子项目)。注意ProjectRef以及子项目的名称-banana-rdf

lazy val bananaRdfProject =
  ProjectRef(uri("https://github.com/w3c/banana-rdf.git"), "banana-rdf")

使用ProjectRef,您应该能够解析banana-rdf 子项目中定义的任何类型。

【讨论】:

RootProject 和 ProjectRef 有什么区别?他们的预期目的是否记录在任何地方?【参考方案2】:

聚合项目和dependsOn 之间存在差异。我认为您需要聚合以使所有项目一起构建,dependsOn 仅确保该项目中的类位于类路径上,但如果您最近没有构建它,它当然可能是一个旧工件。查看 sbt 文档了解更多信息:http://www.scala-sbt.org/0.12.3/docs/Getting-Started/Multi-Project.html

【讨论】:

以上是关于SBT dependsOn RootProject:不编译依赖项的主要内容,如果未能解决你的问题,请参考以下文章

sbt:模块之间的循环依赖?

sbt-assembly 多模块项目?

如何“包含”来自不同模块的 Thrift 文件?

如何将 jdbc 依赖项添加到 Play 项目?

AWS:Cloud Formation:是不是可以使用多个“DependsOn”?

同一包中的 @Around @Aspect 仅适用于 @DependsOn