当publish
时,如果版本中有-SNAPSHOT
,我想将其替换为唯一的时间戳。我已经完成了这项工作,除了与+
进行交叉构建外,它还可以。
似乎每当为交叉构建更改Scala版本时,我设置的version
设置与时间戳都会被清除。
当我尝试交叉构建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一起使用,因为我仍然具有这种依赖性。
答案 0 :(得分:5)
我不确定它是否是SBT 0.13.x
中推荐的方法,但以下似乎对我有用。
如果您需要为crossScalaVersions
中列出的所有版本“拥有相同的时间戳”,那么您可能希望利用Generating files,即IO.write和IO.read方法,用于保存具有唯一快照版本的时间戳文件。
注意请勿在{{1}}中设置scalaVersion
,因为它会覆盖build.sbt
设置的+
。这是我最初答案中的问题。
在stampVersion
中执行以下任务build.sbt
(我将其迁移至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")
在setStampAsVersionAndShow
中定义命令别名build.sbt
以简化测试 - 执行命令version
后,您会看到scalaVersion
和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
中定义setStampAsVersionAndPublish
设置和另一个命令别名build.sbt
:
publishTo := Some(Resolver.file("file", target.value / "xxx"))
addCommandAlias("setStampAsVersionAndPublish",
"; setVersionFromStampFile ; show scalaVersion ; publish")
您现在应该可以按照您的预期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
查看,无需交叉构建(无+
)。
[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
给最后一个命令 - +
进入场景。
[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
答案 1 :(得分:0)
我们可以像这样在bash中设置DATETIME
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
这将确保两个编译版本使用相同的时间戳。