如何让sbt从git中拉取依赖项?

108

我听说过(我也知道我曾经看到过一些示例,只是我记不起来在哪里了),sbt可以从Git仓库中获取依赖。

我想从github上获取依赖harrah/up。该仓库没有提供任何构件JAR文件,只有一个使用sbt设置为构建的源代码树。我想象的过程是sbt将下载源代码仓库,进行构建,然后将其用作依赖构件。

我可能在想像sbt实际上是否能够做到这一点。如果可以,那么如何操作?

4个回答

106

您可以使用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以避免不必要的重新编译(参见这里的说明)。


7
Sbt能否通过“git pull”命令来更新本地的Git仓库?还是我需要手动操作? - Arne
是否可以使用位于项目根目录下的 build.sbt 中的 name := "MyProject" 设置动态地设置 "my-project" - Danyel
2
在play/sbt 13.0中,git://协议语法似乎对我无效。不过,https://可以正常工作。这可能也是由于git特定的设置引起的。 - Sebastian Graf
使用 sbt 0.13.9 并且使用浅克隆(git clone --depth 1)正确地更新 git 依赖项。 - Martin Tapp
2
只有设置为“master”分支时,该分支才能正常工作,否则会出现以下错误:[error] No project 'project_name' in 'ssh://git@github.com/user/project.git#branch' - Neil
@Neil,你在顶层项目中将子项目引用为 project_name,但在子项目的 build.sbt 中可能将其引用为其他名称。val 名称决定了项目名称。 - John Smith

77

确实可以。您可以使用 dependsOn 运算符为您的Project添加依赖项,并且您可以通过其URI引用Github项目,例如:RootProject(uri("git://github.com/dragos/dupcheck.git"))。或者,您可以使用 git clone 命令克隆该项目,然后使用 RootProject(file(...)) 引用您的本地副本。有关详细信息和示例,请参见 SBT wiki 上的“完整配置”


7
你知道是否可以将这个内容包含在 build.sbt 中吗? - Owen
13
很有见地。但是如果该项目发生更改,如何强制sbt重新编译它?clean似乎没有帮助。 - axel22
2
你好,Axel22,你找到解决问题的方法了吗? - Jimmy Luong
4
在 Git 仓库为私有时,如何进行配置?是否有一种方式可以配置 SBT 发送一个部署密钥,该部署密钥可以在点文件或环境变量中设置? - acjay
1
我还想知道如何在将新提交推送到GitHub存储库后,使sbt拉取更改。如果我将其指向#master,重新加载,它会克隆它,然后我将新提交推送到主分支,并且sbt仍然使用最初克隆的存储库而不注意到新提交。此时,必须从/.sbt/0.13/staging/中删除它并让sbt再次克隆它,或者进入该目录并执行git pull - lisak
显示剩余3条评论

10

由于我在解决库依赖问题时遇到了困难(使用建议的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/


1
如果 git clone 出现错误,请尝试使用 https uri 版本。 - Waldemar Wosiński

8

我想为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"))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接