14

などの複数のスナップショット バージョンを持つアーティファクトがありますartifact-0.1-20120831.103456-5

私のプロジェクトは、特定のスナップショット バージョンに依存しています。SBT に0.1-20120831.103456-5代わりにバージョンをダウンロードするように指示0.1-SNAPSHOTすると、更新タスクで失敗します。

// build.sbt
libraryDependencies ++= Seq(
"com.example" % "smith" % "0.1-20120906.110133-36")

// sbt update
[warn] ==== My Repo snapshots: tried
[warn]   http://repo.localhost/snapshots/com/example/smith/0.1-20120906.110133-36/commons-0.1-20120906.110133-36.pom

http://repo.localhost/snapshots/com/example/smith/0.1-SNAPSHOTディレクトリに SBT 検索アーティファクトを作成し、一意のスナップショット バージョンを使用する方法は?

4

3 に答える 3

5

追加独自のバージョンのプラグインとは別に、sbt には aether-deploy プラグインもあります (以下を参照)。

必要に応じてアーティファクトを解決できる独自のバージョンのプラグインがあります。ページからの引用:

指し示す方法

"0.1.0" or "0.1.0-20120602-073010" you can always use the static version number.
"0.1.0-+" selects the latest 0.1.0 snapshot.
"latest.integration" selects the latest revision regardless of its status.
"latest.milestone" selects the latest revision with either Milestone or Release status.
"latest.release" selects the latest with the Release status.

ただし、アーティファクトはバージョンに関して異なる方法で公開されるため、このプラグインでも公開する必要があります。例では、アーティファクトは 0.1-SNAPSHOT ディレクトリではなく、0.1-20120831.103456-5 に保存されます。

追加Aetherを使用する aether-deploy プラグイン もあります (Aether は、Maven リポジトリと対話する標準的な方法を提供します)。問題は、このプラグインが現在デプロイのみに機能することです (プラグインの名前が示すように)。おそらく、作成者は解決のためにも機能するように拡張する計画を持っているでしょう(私にとっては便利な機能のように思えます)。独自のバージョンのプラグインで公開できない場合 (たとえば、スナップショットを所有していない場合)、sbt フォーラムで質問できます。

そのため、あなたのユースケースで maven が行うように正確に機能するソリューションを提供することはできませんが、うまくいけば、あなたや他の人に役立つ情報が得られることを願っています.

于 2012-09-15T11:23:22.050 に答える
2

醜い回避策は、スナップショットの使用法を宣言する代わりに、install:instal-file を使用してスナップショット アーティファクトを SNAPSHOT としてではなく、独自の groupId (たとえば smith.external) にインストールし、目的のバージョン番号を宣言することです。

バージョンが変更されるとは思わないので、提供された安定したバージョン (および通常の groupId) で動作するようになるまで、これに頼ることができます。

于 2012-09-10T13:40:23.607 に答える
2

最善の解決策ではありませんが、Ivy が提供するコンフリクト マネージャーを使用してみてください (Apache ドキュメントを参照)。たとえば、「latest-revision」がデフォルトで使用され、「latest-compatible」マネージャは依存関係の競合を許可しないようにする必要があります。

セットアップは簡単ではないように見えますが、Google sbt グループの誰かが次のルールを投稿しました:

def addConflictManager(org: String, name: String, conflictManager: String) =
  ivyModule <<= (ivyModule, streams) map { (module, s) =>
    module.withModule(s.log) { (ivy, desc, _) =>
        import _root_.org.apache.ivy.{core, plugins}
        import core.module.id.ModuleId
        import plugins.matcher.PatternMatcher

        desc.addConflictManager(
          ModuleId.newInstance(org, name),
          ivy.getSettings.getMatcher(PatternMatcher.EXACT),
          ivy.getSettings.getConflictManager("latest-compatible"))
        module
    }
  }
于 2012-09-11T19:51:53.523 に答える