2014-01-10 22 views
9

publish时,如果版本中有-SNAPSHOT,我想用唯一的时间戳替换它。我已经完成了这个工作,除了与+交叉构建外,它已经可以工作了。在SBT中交叉构建时设置唯一的快照版本

似乎我设置的时间戳记的设置version会在跨版本更改时更改为Scala版本。

当我尝试跨打造publish我使用下面的命令:

sbt ";stamp-version ;+publish" 

下面是命令stamp-version代码:

object TimestampVersion { 

    import Version.Snapshot 

    lazy val versionSettings = Seq(commands += stampVersion) 

    def stampVersion = Command.command("stamp-version") { state => 
    val extracted = Project.extract(state) 
    extracted.append(List(version in ThisBuild ~= { ver => 
     val stmp = stamp(ver) 
     Logging.info("Stamping version %s".format(stmp)) 
     stmp 
    }), state) 
    } 

    def stamp(version: String): String = { 
    if (version endsWith Snapshot) { 
     // we use a dot here to not break rpm versioning rules 
     (version stripSuffix Snapshot) + "." + timestamp(System.currentTimeMillis) 
    } else { 
     version 
    } 
    } 

    def timestamp(time: Long): String = { 
    // no delimiter between date & time in order to not break rpm versioning rules 
    val sdf = new java.text.SimpleDateFormat("yyyyMMddHHmmss") 
    sdf.setTimeZone(TimeZone.getTimeZone("UTC")) 
    sdf.format(new Date(time)) 
    } 
} 

是否有不同的方法,我可以存储我可以通过交叉构建访问的时间戳版本?

编辑:要清楚,我希望每个交叉构建版具有相同的时间戳,这样,当我使用它从别的地方我可以依靠这样的:"x" %% "y" % "z"

而且,这将是最好的,如果该解决方案可以与SBT 0.12.x一起工作,因为我仍然有这种依赖关系。

回答

5

我不确定这是SBT 0.13.x中的推荐方法,但下面的方法似乎对我来说工作得很好。

如果需要“具有相同的时间戳”crossScalaVersions列出的所有版本,那么你可能想利用Generating files,即IO.writeIO.read方法,保存时间戳文件具有独特的快照版本。

注意不要设置在build.sbtscalaVersion,因为它会覆盖一个由+设置。这是我最初的答案中的问题。

有以下任务build.sbtstampVersion(我把它迁移到SBT < 0.13作为练习):

lazy val stampVersion = taskKey[File]("Generates timestamp file with unique snapshot version") 

stampVersion := { 
    val log = streams.value.log 
    val stmp = System.currentTimeMillis 
    val file = target.value/"timestamp" 
    log.info(s"Stamping version $stmp saved in $file") 
    IO.write(file, s"""$stmp""") 
    file 
} 

当您运行任务stampVersion,文件获取target/timestamp文件中创建。

通过以下任务,您可以阅读其内容。

lazy val getStampVersion = taskKey[String]("Retrieves unique snapshot version from timestamp file") 

getStampVersion := { 
    val log = streams.value.log 
    val file = (target in Compile).value/"timestamp" 
    val v = IO.read(file) 
    log.info(s"Retrieving version from $file: $v [scalaVersion: ${scalaVersion.value}]") 
    v 
} 

使用show getStampVersion显示保存在文件中的版本。

[sbt-0-13-1]> stampVersion 
[info] Stamping version 1390606523705 saved in /Users/jacek/sandbox/so/sbt-0.13.1/target/timestamp 
[success] Total time: 0 s, completed Jan 25, 2014 12:35:23 AM 
[sbt-0-13-1]> show getStampVersion 
[info] Retrieving version from /Users/jacek/sandbox/so/sbt-0.13.1/target/timestamp: 1390606523705 [scalaVersion: 2.10.3] 
[info] 1390606523705 
[success] Total time: 0 s, completed Jan 25, 2014 12:35:34 AM 

为了version键设定为时间戳的版本,我定义的命令setVersionFromStampFile(因为它改变一个项目的状态)。

def setVersionFromStampFile = Command.command("setVersionFromStampFile") { state => 
    val e = Project extract state 
    import e._ 
    val (newState, stampVersion) = runTask(getStampVersion, state) 
    val scalaV = scalaVersion in currentRef get structure.data getOrElse Nil 
    state.log.info(s"scalaVersion: $scalaV") 
    val settings = Seq(
    version := stampVersion 
) 
    append(settings ++ structure.settings, state) 
} 

commands += setVersionFromStampFile 

随着命令setVersionFromStampFile,一旦进入运行,version得到适当设置。

[sbt-0-13-1]> show version 
[info] 0.1-SNAPSHOT 
[sbt-0-13-1]> setVersionFromStampFile 
[info] Retrieving version from /Users/jacek/sandbox/so/sbt-0.13.1/target/timestamp: 1390606523705 [scalaVersion: 2.10.3] 
[info] scalaVersion: 2.10.3 
[info] Set current project to sbt-0-13-1 (in build file:/Users/jacek/sandbox/so/sbt-0.13.1/) 
[sbt-0-13-1]> show version 
[info] 1390606523705 

在构建定义build.sbt,已经设定crossScalaVersions限定,例如

crossScalaVersions := Seq("2.9.3", "2.10.3") 

定义命令别名setStampAsVersionAndShowbuild.sbt缓解测试 - 你会看到的versionscalaVersion设置的值在执行命令后setVersionFromStampFile

addCommandAlias("setStampAsVersionAndShow", 
       "; setVersionFromStampFile ; show version; show scalaVersion") 

这使您可以跨执行一系列命令:

[sbt-0-13-1]> + setStampAsVersionAndShow 
[info] Setting version to 2.9.3 
[info] Set current project to sbt-0-13-1 (in build file:/Users/jacek/sandbox/so/sbt-0.13.1/) 
[info] Retrieving version from /Users/jacek/sandbox/so/sbt-0.13.1/target/timestamp: 1390606523705 [scalaVersion: 2.9.3] 
[info] scalaVersion: 2.9.3 
[info] Set current project to sbt-0-13-1 (in build file:/Users/jacek/sandbox/so/sbt-0.13.1/) 
[info] 1390606523705 
[info] 2.9.3 
[info] Setting version to 2.10.3 
[info] Set current project to sbt-0-13-1 (in build file:/Users/jacek/sandbox/so/sbt-0.13.1/) 
[info] Retrieving version from /Users/jacek/sandbox/so/sbt-0.13.1/target/timestamp: 1390606523705 [scalaVersion: 2.10.3] 
[info] scalaVersion: 2.10.3 
[info] Set current project to sbt-0-13-1 (in build file:/Users/jacek/sandbox/so/sbt-0.13.1/) 
[info] 1390606523705 
[info] 2.10.3 
[info] Setting version to 2.10.3 
[info] Set current project to sbt-0-13-1 (in build file:/Users/jacek/sandbox/so/sbt-0.13.1/) 

定义publishTo设置和一个其他命令别名setStampAsVersionAndPublishbuild.sbt

publishTo := Some(Resolver.file("file", target.value/"xxx")) 

addCommandAlias("setStampAsVersionAndPublish", 
       "; setVersionFromStampFile ; show scalaVersion ; publish") 

您现在应该能够publish如你所期望:

  1. 让我们重新开始。

    [sbt-0-13-1]> clean 
    [success] Total time: 0 s, completed Jan 25, 2014 12:50:22 AM 
    
  2. 生成版本文件。

    [sbt-0-13-1]> stampVersion 
    [info] Stamping version 1390607428495 saved in /Users/jacek/sandbox/so/sbt-0.13.1/target/timestamp 
    [success] Total time: 0 s, completed Jan 25, 2014 12:50:28 AM 
    
  3. publish检查它无交叉建筑物(无+)。

    [sbt-0-13-1]> setStampAsVersionAndPublish 
    [info] Retrieving version from /Users/jacek/sandbox/so/sbt-0.13.1/target/timestamp: 1390607428495 [scalaVersion: 2.10.3] 
    [info] scalaVersion: 2.10.3 
    [info] Set current project to sbt-0-13-1 (in build file:/Users/jacek/sandbox/so/sbt-0.13.1/) 
    [info] 2.10.3 
    [info] Packaging /Users/jacek/sandbox/so/sbt-0.13.1/target/scala-2.10/sbt-0-13-1_2.10-1390607428495-sources.jar ... 
    [info] Done packaging. 
    [info] Updating {file:/Users/jacek/sandbox/so/sbt-0.13.1/}sbt-0-13-1... 
    [info] Wrote /Users/jacek/sandbox/so/sbt-0.13.1/target/scala-2.10/sbt-0-13-1_2.10-1390607428495.pom 
    [info] Resolving org.fusesource.jansi#jansi;1.4 ... 
    [info] Done updating. 
    [info] :: delivering :: default#sbt-0-13-1_2.10;1390607428495 :: 1390607428495 :: release :: Sat Jan 25 00:50:33 CET 2014 
    [info] delivering ivy file to /Users/jacek/sandbox/so/sbt-0.13.1/target/scala-2.10/ivy-1390607428495.xml 
    [info] Compiling 1 Scala source to /Users/jacek/sandbox/so/sbt-0.13.1/target/scala-2.10/classes... 
    [info] Main Scala API documentation to /Users/jacek/sandbox/so/sbt-0.13.1/target/scala-2.10/api... 
    model contains 2 documentable templates 
    [info] Main Scala API documentation successful. 
    [info] Packaging /Users/jacek/sandbox/so/sbt-0.13.1/target/scala-2.10/sbt-0-13-1_2.10-1390607428495-javadoc.jar ... 
    [info] Done packaging. 
    [info] Packaging /Users/jacek/sandbox/so/sbt-0.13.1/target/scala-2.10/sbt-0-13-1_2.10-1390607428495.jar ... 
    [info] Done packaging. 
    [info] published sbt-0-13-1_2.10 to /Users/jacek/sandbox/so/sbt-0.13.1/target/xxx/default/sbt-0-13-1_2.10/1390607428495/sbt-0-13-1_2.10-1390607428495.pom 
    [info] published sbt-0-13-1_2.10 to /Users/jacek/sandbox/so/sbt-0.13.1/target/xxx/default/sbt-0-13-1_2.10/1390607428495/sbt-0-13-1_2.10-1390607428495.jar 
    [info] published sbt-0-13-1_2.10 to /Users/jacek/sandbox/so/sbt-0.13.1/target/xxx/default/sbt-0-13-1_2.10/1390607428495/sbt-0-13-1_2.10-1390607428495-sources.jar 
    [info] published sbt-0-13-1_2.10 to /Users/jacek/sandbox/so/sbt-0.13.1/target/xxx/default/sbt-0-13-1_2.10/1390607428495/sbt-0-13-1_2.10-1390607428495-javadoc.jar 
    [success] Total time: 1 s, completed Jan 25, 2014 12:50:34 AM 
    
  4. 得到最终的命令一展身手 - +进入现场。关于SBT与about构建

    [sbt-0-13-1]> + setStampAsVersionAndPublish 
    [info] Setting version to 2.9.3 
    [info] Set current project to sbt-0-13-1 (in build file:/Users/jacek/sandbox/so/sbt-0.13.1/) 
    [info] Retrieving version from /Users/jacek/sandbox/so/sbt-0.13.1/target/timestamp: 1390607428495 [scalaVersion: 2.9.3] 
    [info] scalaVersion: 2.9.3 
    [info] Set current project to sbt-0-13-1 (in build file:/Users/jacek/sandbox/so/sbt-0.13.1/) 
    [info] 2.9.3 
    [info] Packaging /Users/jacek/sandbox/so/sbt-0.13.1/target/scala-2.9.3/sbt-0-13-1_2.9.3-1390607428495-sources.jar ... 
    [info] Done packaging. 
    [info] Updating {file:/Users/jacek/sandbox/so/sbt-0.13.1/}sbt-0-13-1... 
    [info] Wrote /Users/jacek/sandbox/so/sbt-0.13.1/target/scala-2.9.3/sbt-0-13-1_2.9.3-1390607428495.pom 
    [info] Resolving org.fusesource.jansi#jansi;1.4 ... 
    [info] Done updating. 
    [info] :: delivering :: default#sbt-0-13-1_2.9.3;1390607428495 :: 1390607428495 :: release :: Sat Jan 25 00:50:51 CET 2014 
    [info] Compiling 1 Scala source to /Users/jacek/sandbox/so/sbt-0.13.1/target/scala-2.9.3/classes... 
    [info] delivering ivy file to /Users/jacek/sandbox/so/sbt-0.13.1/target/scala-2.9.3/ivy-1390607428495.xml 
    [info] Main Scala API documentation to /Users/jacek/sandbox/so/sbt-0.13.1/target/scala-2.9.3/api... 
    model contains 2 documentable templates 
    [info] Main Scala API documentation successful. 
    [info] Packaging /Users/jacek/sandbox/so/sbt-0.13.1/target/scala-2.9.3/sbt-0-13-1_2.9.3-1390607428495-javadoc.jar ... 
    [info] Done packaging. 
    [info] Packaging /Users/jacek/sandbox/so/sbt-0.13.1/target/scala-2.9.3/sbt-0-13-1_2.9.3-1390607428495.jar ... 
    [info] Done packaging. 
    [info] published sbt-0-13-1_2.9.3 to /Users/jacek/sandbox/so/sbt-0.13.1/target/xxx/default/sbt-0-13-1_2.9.3/1390607428495/sbt-0-13-1_2.9.3-1390607428495.pom 
    [info] published sbt-0-13-1_2.9.3 to /Users/jacek/sandbox/so/sbt-0.13.1/target/xxx/default/sbt-0-13-1_2.9.3/1390607428495/sbt-0-13-1_2.9.3-1390607428495.jar 
    [info] published sbt-0-13-1_2.9.3 to /Users/jacek/sandbox/so/sbt-0.13.1/target/xxx/default/sbt-0-13-1_2.9.3/1390607428495/sbt-0-13-1_2.9.3-1390607428495-sources.jar 
    [info] published sbt-0-13-1_2.9.3 to /Users/jacek/sandbox/so/sbt-0.13.1/target/xxx/default/sbt-0-13-1_2.9.3/1390607428495/sbt-0-13-1_2.9.3-1390607428495-javadoc.jar 
    [success] Total time: 4 s, completed Jan 25, 2014 12:50:54 AM 
    [info] Setting version to 2.10.3 
    [info] Set current project to sbt-0-13-1 (in build file:/Users/jacek/sandbox/so/sbt-0.13.1/) 
    [info] Retrieving version from /Users/jacek/sandbox/so/sbt-0.13.1/target/timestamp: 1390607428495 [scalaVersion: 2.10.3] 
    [info] scalaVersion: 2.10.3 
    [info] Set current project to sbt-0-13-1 (in build file:/Users/jacek/sandbox/so/sbt-0.13.1/) 
    [info] 2.10.3 
    [info] Packaging /Users/jacek/sandbox/so/sbt-0.13.1/target/scala-2.10/sbt-0-13-1_2.10-1390607428495-sources.jar ... 
    [info] Done packaging. 
    [info] Updating {file:/Users/jacek/sandbox/so/sbt-0.13.1/}sbt-0-13-1... 
    [info] Wrote /Users/jacek/sandbox/so/sbt-0.13.1/target/scala-2.10/sbt-0-13-1_2.10-1390607428495.pom 
    [info] Resolving org.fusesource.jansi#jansi;1.4 ... 
    [info] Done updating. 
    [info] :: delivering :: default#sbt-0-13-1_2.10;1390607428495 :: 1390607428495 :: release :: Sat Jan 25 00:50:55 CET 2014 
    [info] delivering ivy file to /Users/jacek/sandbox/so/sbt-0.13.1/target/scala-2.10/ivy-1390607428495.xml 
    [info] Compiling 1 Scala source to /Users/jacek/sandbox/so/sbt-0.13.1/target/scala-2.10/classes... 
    [info] Main Scala API documentation to /Users/jacek/sandbox/so/sbt-0.13.1/target/scala-2.10/api... 
    model contains 2 documentable templates 
    [info] Main Scala API documentation successful. 
    [info] Packaging /Users/jacek/sandbox/so/sbt-0.13.1/target/scala-2.10/sbt-0-13-1_2.10-1390607428495-javadoc.jar ... 
    [info] Done packaging. 
    [info] Packaging /Users/jacek/sandbox/so/sbt-0.13.1/target/scala-2.10/sbt-0-13-1_2.10-1390607428495.jar ... 
    [info] Done packaging. 
    [info] published sbt-0-13-1_2.10 to /Users/jacek/sandbox/so/sbt-0.13.1/target/xxx/default/sbt-0-13-1_2.10/1390607428495/sbt-0-13-1_2.10-1390607428495.pom 
    [info] published sbt-0-13-1_2.10 to /Users/jacek/sandbox/so/sbt-0.13.1/target/xxx/default/sbt-0-13-1_2.10/1390607428495/sbt-0-13-1_2.10-1390607428495.jar 
    [info] published sbt-0-13-1_2.10 to /Users/jacek/sandbox/so/sbt-0.13.1/target/xxx/default/sbt-0-13-1_2.10/1390607428495/sbt-0-13-1_2.10-1390607428495-sources.jar 
    [info] published sbt-0-13-1_2.10 to /Users/jacek/sandbox/so/sbt-0.13.1/target/xxx/default/sbt-0-13-1_2.10/1390607428495/sbt-0-13-1_2.10-1390607428495-javadoc.jar 
    [success] Total time: 2 s, completed Jan 25, 2014 12:50:56 AM 
    [info] Setting version to 2.10.3 
    [info] Set current project to sbt-0-13-1 (in build file:/Users/jacek/sandbox/so/sbt-0.13.1/) 
    
  5. 显示基本信息。

    [sbt-0-13-1]> about 
    [info] This is sbt 0.13.1 
    [info] The current project is {file:/Users/jacek/sandbox/so/sbt-0.13.1/}sbt-0-13-1 0.1-SNAPSHOT 
    [info] The current project is built against Scala 2.10.3 
    [info] Available Plugins: com.typesafe.sbt.SbtGit, com.typesafe.sbt.SbtProguard, growl.GrowlingTests, np.Plugin, com.timushev.sbt.updates.UpdatesPlugin 
    [info] sbt, sbt plugins, and build definitions are using Scala 2.10.3 
    
+0

感谢亚采。我更新了我应该更具体的问题。这个解决方案看起来好像每个版本的Scala都有不同的时间戳组件,它们是交叉构建的,这对我来说并不是那么有用,因为它很难依赖于它。 – myyk

+0

@myyk答案已经改变,以反映要求。在回答你的问题时(和掌握SBT)一样有趣。 –

+0

感谢迄今为止的一切,这是非常有用的,当我完成后我会分享我的0.12自适应。虽然你的解决方案有问题,但我也一样,它也在上面的输出中。设置到版本2.9.3后,你可以看到它发布到sbt-0-13-1_2.10这是错误的,它应该是sbt-0-13-1_2.9.3。 – myyk

相关问题