如何从git中提取依赖项工件?

时间:2011-09-26 03:24:55

标签: git scala build sbt build-dependencies

我听说(而且我知道我也见过一些例子,只要我能记住哪里)sbt可以从git repo获得依赖。

我希望从github获取依赖项harrah/up。存储库不提供任何工件JAR文件,只提供设置为使用sbt构建的源树。我想象的过程是sbt将下载源代码,构建它,然后将其用作依赖项工件。

我可能想象sbt实际上可以做这样的事情。它可以?如果是这样,怎么样?

4 个答案:

答案 0 :(得分:93)

您可以使用dependsOn运算符将未打包的依赖项从GitHub导入到项目中,方法是将它们视为项目依赖项。 (这与预编译库依赖项的包含方式不同。)

请注意,您可以使用#表示法指定要拉出的分支。这里有一些适合我的Scala SBT代码:

object V {
  val depProject = "master"
  // Other library versions
}

object Projects {
  lazy val depProject = RootProject(uri("git://github.com/me/dep-project.git#%s".format(V.depProject)))
}

// Library dependencies
lazy val myProject = Project("my-project", file("."))
.settings(myProjectSettings: _*)
.dependsOn(Projects.depProject)
.settings(
  libraryDependencies ++= Seq(...

请注意,如果您有多个依赖于同一外部项目的SBT项目,则值得设置一个中心sbt.boot.directory以避免不必要的重新编译(请参阅instructions here)。

答案 1 :(得分:76)

确实是的。您可以使用Project运算符为dependsOn提供依赖关系,并且可以通过其URI引用Github项目,例如RootProject(uri("git://github.com/dragos/dupcheck.git"))。或者,您可以git clone项目,然后使用RootProject(file(...))引用您的本地副本。有关详细信息和示例,请参阅SBT wiki上的"Full Configuration"

答案 2 :(得分:7)

由于我在解决我的库的依赖关系时遇到了问题(使用建议的RootProject),我想指出名为ProjectRef的对象。因此,如果需要依赖于驻留在git中的库,我建议如下:

import sbt.Keys._
import sbt._

object MyBuild extends Build {

  lazy val root = Project("root", file("."))
    .dependsOn(myLibraryinGit)
    .settings(
      ...,
      libraryDependencies ++= Seq(...))

  lazy val myLibraryinGit = ProjectRef(uri("git://git@github.com:user/repo.git#branch"), "repo-name")

}

来源:http://blog.xebia.com/git-subproject-compile-time-dependencies-in-sbt/

答案 3 :(得分:6)

我想为sbt 0.13+添加一个答案。只需将这样的内容放到项目根文件夹build.sbt上(不是Build.scala):

lazy val root = (project in file(".")).dependsOn(playJongo)

lazy val playJongo = RootProject(uri("https://github.com/bekce/play-jongo.git"))