设置sbt以基于git branch发布到artifactory

mit*_*hus 8 git artifactory sbt sbt-assembly

我想建立一个sbt项目,以便它可以基于(git)分支发布到适当的神器库.

针对此问题提出的解决方案建议在build.sbt文件中对存储库进行硬编码.

但是,我希望master分支发布到"releases",并使用相同的build.sbt文件发布到"snapshots"的另一个分支.

理想情况下,我想要以下内容:

val gitBranch = taskKey[String]("Determines current git branch")               
gitBranch := Process("git rev-parse --abbrev-ref HEAD").lines.head 

publishTo := {                                                                 
  val myArtifactory = "http://some.where/"        
  if (gitBranch.value == "master")                                             
    Some("releases"  at myArtifactory + "releases")                              
  else                                                                         
    Some("snapshots" at myArtifactory + "snapshots")                             
}                  
Run Code Online (Sandbox Code Playgroud)

但这会产生"错误:设置不能依赖于任务".

mit*_*hus 6

一种解决方案是使用sbt-release插件,然后使用isSnapshot(这是一种设置)来选择存储库。

解决原始问题的方法是简单地进行gitBranch设置:

val gitBranch = settingKey[String]("Determines current git branch")               
Run Code Online (Sandbox Code Playgroud)

代替

val gitBranch = taskKey[String]("Determines current git branch")     
Run Code Online (Sandbox Code Playgroud)

请注意,设置仅在sbt会话开始时计算一次,因此,如果会话中存在任何分支切换,则此设置不适用。

因此,整个代码段将变为:

val gitBranch = settingKey[String]("Determines current git branch")
gitBranch := Process("git rev-parse --abbrev-ref HEAD").lineStream.head

publishTo := {                                                                 
  val myArtifactory = "http://some.where/"        
  if (gitBranch.value == "master")                                             
    Some("releases"  at myArtifactory + "releases")                              
  else                                                                         
    Some("snapshots" at myArtifactory + "snapshots")                             
}
Run Code Online (Sandbox Code Playgroud)