如何通知 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】:您还可以指定sbtVersion
和scalaVersion
。有一个重载的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 缓存目录中找到混乱的 A
的 ivy.xml
。无法找到 sbt 明显看到的那个。
长话短说:我不得不人为地修改A
的版本,以消除缓存在某个隐藏位置的错误ivy.xml
。这迫使 sbt 使用正确的 ivy.xml
重新查找 A
(不再依赖于插件)。
现在我只是担心如果我将全局插件设置到位会发生什么:-#
未来建议:永远不要将任何东西放入~/.sbt/plugins.sbt
。如果您需要 sbt 了解您更改了~/.sbt/plugins/build.sbt
:重新启动您的计算机。不要触摸任何文件。
【讨论】:
以上是关于如何通知 SBT 使用插件的特定 scala 版本?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 SBT Jenkins 插件运行特定测试以进行 ScalaTest 测试