Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 在SBT中跨构建时设置唯一快照版本_Scala_Sbt - Fatal编程技术网

Scala 在SBT中跨构建时设置唯一快照版本

Scala 在SBT中跨构建时设置唯一快照版本,scala,sbt,Scala,Sbt,当发布时,如果版本中有-SNAPSHOT,我想用唯一的时间戳替换它。我已经完成了这项工作,除了使用+进行交叉构建之外,它还能工作 [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

发布
时,如果版本中有
-SNAPSHOT
,我想用唯一的时间戳替换它。我已经完成了这项工作,除了使用
+
进行交叉构建之外,它还能工作

[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
似乎每当为交叉构建更改Scala版本时,我设置的带有时间戳的
version
设置就会被清除

当我尝试交叉生成
publish
时,我使用以下命令:

sbt ";stamp-version ;+publish"
以下是命令的代码
戳记版本

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一起工作,那将是最好的,因为我仍然有这种依赖关系。

我不确定它是否是SBT
0.13.x中的推荐方法,但以下内容似乎对我来说很好

如果您需要对
CrossScalarVersions
中列出的所有版本“具有相同的时间戳”,则您可能希望利用(即)和方法,以唯一的快照版本保存时间戳文件

注意不要在
build.sbt
中设置
scalaVersion
,因为它会覆盖
+
设置的值。这就是我最初回答的问题

build.sbt
中执行以下任务
stampVersion
(我将其迁移到sbt<0.13作为练习):

运行任务
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
(当它更改项目状态时)

使用命令
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 := Seq("2.9.3", "2.10.3")
build.sbt
中定义命令别名
setstampasversion并显示
,以便于测试-执行命令
setVersionFromStampFile
后,您将看到
version
scalaVersion
设置的值:

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/)
build.sbt
中定义
publishTo
设置和另一个命令别名
setstampasversion和publish

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

addCommandAlias("setStampAsVersionAndPublish",
                "; setVersionFromStampFile ; show scalaVersion ; publish")
现在,您应该能够像预期的那样发布

  • 让我们重新开始

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

    [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
    
  • 使用
    publish
    查看,无需跨建筑(无
    +

  • 给最后一个命令一个go-
    +
    进入场景

    [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/)
    
  • 使用
    about
    显示有关sbt和生成的基本信息

    [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
    

  • 我们可以像这样在bash中设置日期时间

    export DATETIME=`date +"%Y-%m-%d_%H-%M-%S"`
    
    然后像这样构建我们的软件

    sbt 'set version in ThisBuild := s"1.0.0-${sys.env.get("DATETIME").get}"' +compile +publish
    

    这将确保两个编译版本使用相同的时间戳。

    谢谢Jacek。我更新了我应该更具体的问题。这个解决方案似乎对交叉构建的Scala的每个版本都有一个不同的时间戳组件,这对我来说并没有那么有用,因为很难依赖它。@myyk答案已更改以反映需求。当我回答你的问题(并掌握SBT)时,享受和我一样多的乐趣。感谢迄今为止所做的一切,这非常有帮助,当我完成后,我将分享我的0.12改编。不过,您的解决方案有一个问题,我也有同样的问题,它也存在于上面的输出中。设置为2.9.3版后,您可以看到它正在发布到sbt-0-13-1_2.10,这是错误的,它应该是sbt-0-13-1_2.9.3.更新的。它似乎工作得很好,
    scalaversation
    。试试看,回来汇报!如果您确实需要设置scalaVersion并拥有一个多项目构建,那么您可能必须将此构建中的scalaVersion设置为您想要的版本。我在设置stampVersion时读取了值,这对我很有用。
    export DATETIME=`date +"%Y-%m-%d_%H-%M-%S"`
    
    sbt 'set version in ThisBuild := s"1.0.0-${sys.env.get("DATETIME").get}"' +compile +publish