2014-01-10 11 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)) 
    } 
} 

私ができる別の方法はあります私のクロスビルドでアクセスできるタイムスタンプ付きのバージョンを保存しますか?

EDITは:明確にするために、私はどこか別の場所からそれを使用するとき、私はこのように依存することができるように、各クロス構築されたバージョンが同じタイムスタンプを持つようにしたい:、また"x" %% "y" % "z"

それが最善の場合だろう私はまだその依存関係があるので、ソリューションはSBT 0.12.xで動作する可能性があります。

答えて

5

SBT 0.13.xで推奨されるアプローチであるかどうかはわかりませんが、以下は私にとってうまくいきました。

あなたがに必要がある場合はcrossScalaVersionsに記載されているすべてのバージョンの「同じタイムスタンプを持っている」、あなたは独自のスナップショットのバージョンとタイムスタンプファイルを保存するために、Generating files、すなわちIO.writeIO.read方法を活用することもできます。それは+によって設定されたものを上書きするよう

NOTEbuild.sbtscalaVersionを設定しないでください。それが私の最初の答えの問題でした。

は(私が練習としてSBT < 0.13への移行まま)build.sbtに次のタスクstampVersionを持っている:

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キーを設定するために(それはプロジェクトの状態を変化させるように)、IコマンドsetVersionFromStampFileを定義しました。コマンド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 

それが実行されますたび、versionが適切に設定されます。ビルド定義build.sbt

[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 

は、設定crossScalaVersions定義した、例えば

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

テストを容易にするためにbuild.sbtにコマンドエイリアスsetStampAsVersionAndShowを定義する - あなたはコマンドsetVersionFromStampFileを実行した後versionscalaVersion設定の値が表示されます:

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の設定と他のコマンドエイリアスbuild.sbtsetStampAsVersionAndPublish

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-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とaboutとビルドに関する基本的な情報を表示します。

    [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

関連する問題