设置 sbt 发布到基于 git 分支的人工制品

Setting up sbt to publish to artifactory based on git branch

我想建立一个 sbt 项目,以便它可以发布到基于 (git) 分支的正确的工件存储库。

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

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

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

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")                             
}                  

但这会产生 "error: A setting cannot depend on a task"。

一个近似的解决方案是使用 sbt-release 插件,然后使用 isSnapshot(这是一个设置)以便 select 存储库。

原问题的解决方法是简单地gitBranch一个设置:

val gitBranch = settingKey[String]("Determines current git branch")               

而不是

val gitBranch = taskKey[String]("Determines current git branch")     

请注意,设置仅在 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")                             
}