如何通知 SBT 使用插件的特定 scala 版本?

Posted

技术标签:

【中文标题】如何通知 SBT 使用插件的特定 scala 版本?【英文标题】:How to inform SBT to consume specific scala version for plugins? 【发布时间】: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 完成了这项工作,效果很好 我该怎么做? - 如果您将其粘贴为答案,我很有可能会用该答案结束问题:) 尝试清除您的项目/项目/目标目录(这是编译后的项目配置所在的位置) 【参考方案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:重新启动您的计算机。不要触摸任何文件。

【讨论】:

以上是关于如何通知 SBT 使用插件的特定 scala 版本?的主要内容,如果未能解决你的问题,请参考以下文章

如何从特定项目的交叉构建的sbt多项目中删除scala版本

如何使用 SBT Jenkins 插件运行特定测试以进行 ScalaTest 测试

Sbt 0.13 插件依赖和 scala-reflect.jar 版本冲突

Sbt的使用初步和用sbt插件生成eclipse工程

关于scala工程结构(使用sbt)

在 SBT 中添加 sbt native packager 插件