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

一个丑陋的解决方法是将快照工件安装在您自己的 groupId(比如 smith.external)中,而不是作为 SNAPSHOT,使用 install:instal-file 并声明所需的版本号,而不是声明快照的使用。

由于您不希望版本发生变化,因此您可以依赖它,直到您让它与提供的稳定版本(和常规 groupId)一起使用

于 2012-09-10T13:40:23.607 回答
2

不是最好的解决方案,但您可以尝试使用 Ivy 提供的冲突管理器(请参阅 apache 文档)。例如,默认使用“最新修订”,“最新兼容”管理器应禁止任何依赖冲突。

不过,设置起来并不容易, google sbt group 上的某个人发布了以下规则:

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 回答