Como o sbt pode extrair artefatos de dependência do git?

102

Eu ouvi (e sei que também vi exemplos, se pelo menos me lembrar de onde) que sbtpode obter dependências de um repositório git.

Estou procurando obter a dependência harrah / up do github. O repositório não fornece nenhum arquivo JAR de artefato, apenas uma árvore de origem que é configurada para ser construída usando sbt. O processo que estou imaginando é sbtfazer o download do repositório de origem, compilá-lo e usá-lo como o artefato de dependência.

Posso estar imaginando que sbtposso de fato fazer algo assim. Pode? E se sim, como?

Owen
fonte

Respostas:

77

Sim, de fato. Você pode fornecer Projectuma dependência com o dependsOnoperador e pode fazer referência a um projeto Github por seu URI, por exemplo RootProject(uri("git://github.com/dragos/dupcheck.git")). Como alternativa, você pode git clonecriar o projeto e, em seguida, referenciar sua cópia local com RootProject(file(...)). Veja "Configuração Completa" no wiki do SBT para detalhes e exemplos.

Kipton Barros
fonte
6
Você sabe se é possível incluir isso build.sbt?
Owen,
13
Ótima percepção. Mas se esse projeto mudar, como você o força sbta recompilá-lo? cleannão parece ajudar.
axel22
2
Olá Axel22, encontrou alguma solução para o seu problema?
Jimmy Luong
4
Como você pode configurar isso em situações em que o repo git é privado? Existe uma maneira de configurar o SBT para enviar uma chave de implantação, que poderia ser definida em um dotfile ou variável de ambiente?
acjay
1
Eu também gostaria de saber como fazer alterações de pull sbt depois de enviar um novo commit para o repositório github, se eu apontar para #master, recarregar, ele o clona, ​​então eu envio um novo commit para master e sbt ainda funciona com o repositório originalmente clonado sem perceber um novo commit. Neste ponto, é preciso excluí-lo /.sbt/0.13/staging/e fazer com que o sbt o clone novamente ou ir lá e fazergit pull
lisak
99

Você pode importar dependências não empacotadas para seu projeto do GitHub tratando-as como dependências do projeto, usando o dependsOnoperador. (Isso é diferente da maneira como as dependências da biblioteca pré-compilada são incluídas).

Observe que você pode especificar qual branch puxar usando a #notação. Aqui estão alguns códigos Scala SBT que estão funcionando bem para mim:

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(...

Observe que se você tiver vários projetos SBT que dependem do mesmo projeto externo, vale a pena configurar uma central sbt.boot.directorypara evitar recompilações desnecessárias (veja as instruções aqui ).

Alex Dean
fonte
7
o sbt também pode manter o git local atualizado com "git pull"? Ou preciso fazer isso manualmente?
Arne
É possível definir "my-project"dinamicamente, usando a name := "MyProject"configuração da build.sbtraiz do projeto?
Danyel
2
git://a sintaxe do protocolo não parece funcionar para mim no play / sbt 13.0. https://funciona embora. Isso também pode ser causado por uma configuração específica do git.
Sebastian Graf
Usar sbt 0.13.9 e sbt atualiza a dependência git corretamente usando um clone raso (git clone --depth 1).
Martin Tapp
2
O branch só funciona se definido como master, caso contrário, recebo:[error] No project 'project_name' in 'ssh://[email protected]/user/project.git#branch'
Neil
9

Como tive problemas para resolver as dependências da minha biblioteca (usando o sugerido RootProject), gostaria de apontar para o objeto chamado ProjectRef. Assim, se for necessário depender de uma biblioteca residente no git, sugiro fazê-lo da seguinte maneira:

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://[email protected]:user/repo.git#branch"), "repo-name")

}

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

Marc Juchli
fonte
1
Em caso de erro de clone git tente com a https uriversão.
Waldemar Wosiński
6

Eu queria adicionar uma resposta para sbt 0.13+. Basta colocar algo assim build.sbtna pasta raiz do projeto (não Build.scala):

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

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