【问题标题】:How to inform SBT to consume specific scala version for plugins?如何通知 SBT 使用插件的特定 scala 版本?
【发布时间】:2012-07-30 21:48:51
【问题描述】:

现在我不知何故弄乱了我的全局 sbt 插件 (~/.sbt/plugins/build.sbt)。 Scala 2.9.1 似乎是 sbt 0.11.3 想要的版本,并且所有插件(sbt-gpg-plugin、sbt-idea-plugin)都是针对 2.9.1 发布的。

现在无论我做什么,它都会不断尝试找到它们是针对 2.9.2 构建的:

[warn]  Note: Some unresolved dependencies have extra attributes.  Check that these dependencies exist with the requested attributes.
[warn]      com.github.mpeltonen:sbt-idea:1.0.0 (sbtVersion=0.11.3, scalaVersion=2.9.2)
[warn]      com.jsuereth:xsbt-gpg-plugin:0.6 (sbtVersion=0.11.3, scalaVersion=2.9.2)
...
[error] {file:...}default-50be6e/*:update: sbt.ResolveException: unresolved dependency: com.github.mpeltonen#sbt-idea;1.0.0: not found

我该如何解决这个问题,以便 sbt 像以前一样检索 Scala 2.9.1 的插件?


为了完整起见,我的文件是这样处理建议的:

// project-home/build.sbt
scalaVersion := "2.9.2"
...

 

// project-home/project/plugins.sbt
resolvers += "less is" at "http://repo.lessis.me"

addSbtPlugin( "me.lessis" % "ls-sbt" % "0.1.1" )

scalaVersion := "2.9.1"  // "just in case it helps"

 

// ~/.sbt/plugins/build.sbt
scalaVersion := "2.9.1"  // "just in case it helps"

resolvers += "sbt-idea-repo" at "http://mpeltonen.github.com/maven/"

resolvers += Resolver.url( "sbt-plugin-releases", url( "http://scalasbt.artifactoryonline.com/scalasbt/sbt-plugin-releases" ))( Resolver.ivyStylePatterns )

addSbtPlugin("com.github.mpeltonen" % "sbt-idea" % "1.0.0")

addSbtPlugin( "com.jsuereth" % "xsbt-gpg-plugin" % "0.6" )

更糟糕的是,即使在我删除 ~/.sbt/plugins/build.sbt 之后,问题仍然存在。所以没有更多对 sbt-idea 或 xsbt-gpg-plugin 的引用(至少对我可见)。我仍然无法编译任何项目,因为 sbt 仍然试图找到这两个插件。史诗般的失败。

【问题讨论】:

  • 这只是一个警告,而不是错误,但无论如何你为什么不尝试在 plugins/build.sbt 中写scalaVersion := "2.9.1"
  • @om-nom-nom - 不幸的是,我编辑了问题并添加了错误行。无法建造。我不想写 scalaVersion := "2.9.1",因为我希望我的 project 工件针对 2.9.2 发布。但是愚蠢的 sbt 0.11.3 只接受 2.9.1 的 plugins。这就是为什么它们只存在于 2.9.1 的在线版本(如想法插件)。但现在它突然改变了主意,想要 2.9.2。我总是试图公开为 sbt 辩护,但这些时刻让我严重怀疑自己的善意。
  • 无论如何,您也可以在 build.sbt 中为插件设置 scala 版本。我已经用 2.10-SNAPSHOT 完成了这项工作,效果很好
  • 我该怎么做? - 如果您将其粘贴为答案,我很有可能会用该答案结束问题:)
  • 尝试清除您的项目/项目/目标目录(这是编译后的项目配置所在的位置)

标签: scala sbt


【解决方案1】:

您可以提供 Scala 版本的插件。我没有使用 ~/.sbt/,但我认为它也可以。

以下是我的项目配置,使用 Scala 2.9.2 作为我的项目编译器,并使用了一些从 Scala 2.9.1 编译的插件。由于 Scala 2.9.1 和 Scala 2.9.2 是二进制兼容的,所以我还没有遇到任何问题。

// MyProject/build.sbt

name := "MyProject"            

version := "0.1"            

scalaVersion := "2.9.2"     

以下是插件配置:

// File: MyProject/project/plugins.sbt

import sbt._

import Defaults._

resolvers += Resolver.url("sbt-plugin-releases",
  new URL("http://scalasbt.artifactoryonline.com/scalasbt/sbt-plugin-releases/"))(
    Resolver.ivyStylePatterns)


// Resolved to: 
//
//  http://..../com.untyped/sbt-less/scala_2.9.1/sbt_0.11.3/0.4/jars/sbt-less.jar 
//
libraryDependencies += sbtPluginExtra(
    m = "com.untyped" % "sbt-less" % "0.4", // Plugin module name and version
    sbtV = "0.11.3",    // SBT version
    scalaV = "2.9.1"    // Scala version compiled the plugin
)

【讨论】:

  • 谢谢布赖恩,正如我在回答中概述的那样,问题是插件不知何故潜入了依赖项目的 ivy.xml。但是sbtPluginExtra 的信息很棒!
【解决方案2】:

一些参考资料:

SBT plugins are versioned to the scala version they were built with.

You're not the only one... 再次,没有答案。

And another case study, this may have answers.

一个可能相关的报价? " 记得同时删除 project/plugins 目录,因为如果该目录存在,project/plugins.sbt 将被忽略。"

【讨论】:

    【解决方案3】:

    您还可以指定sbtVersionscalaVersion。有一个重载的addSbtPlugin -

    addSbtPlugin(dependency : sbt.ModuleID, sbtVersion : scala.Predef.String, scalaVersion : scala.Predef.String)
    

    【讨论】:

      【解决方案4】:

      好的,我回顾了所有可能导致这种情况的事件。而且因为我发现其他项目仍在构建中,我开始了解这个特定项目 B 的问题在于,这两个插件似乎是项目 A常规依赖项取决于。

      当 sbt 拒绝承认我在 ~/.sbt/plugins/build.sbt 中取消注释的 GPG 插件的存在时,我 将该文件重命名~/.sbt/plugins.sbt,然后再次返回。这个中间位置不知何故意味着插件不再是插件(尽管被添加为addSbtPlugin),而是当我发布时项目A的常规依赖项。

      我试图在所有已知的 Ivy2 缓存目录中找到混乱的 Aivy.xml。无法找到 sbt 明显看到的那个。

      长话短说:我不得不人为地修改A 的版本,以消除缓存在某个隐藏位置的错误ivy.xml。这迫使 sbt 使用正确的 ivy.xml 重新查找 A(不再依赖于插件)。

      现在我只是担心如果我将全局插件设置到位会发生什么:-#


      未来建议:永远不要将任何东西放入~/.sbt/plugins.sbt。如果您需要 sbt 了解您更改了~/.sbt/plugins/build.sbt:重新启动您的计算机。不要触摸任何文件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-01
        • 2017-11-06
        • 2013-03-22
        • 2012-07-10
        • 1970-01-01
        • 2013-01-12
        • 1970-01-01
        • 2021-11-12
        相关资源
        最近更新 更多