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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何通知SBT使用插件的特定scala版本?相关的知识,希望对你有一定的参考价值。

现在我以某种方式搞砸了我的全球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仍然试图找到这两个插件。史诗失败。

答案

您可以提供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
)
另一答案

一些参考:

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.sbt。”

另一答案

好的,我回到了可能导致这一切的所有事件。因为我发现其他项目仍在构建,我开始明白这个特殊项目B的问题在于它看起来两个插件是项目A的常规依赖项,它依赖于它。

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

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

简短的回答:简短的回答:我不得不人为地碰撞A的版本,以摆脱在隐藏的地方缓存的错误的ivy.xml。这迫使sbt用正确的A重新找到ivy.xml(不再依赖于插件)。

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


未来建议:永远不要把任何东西放到~/.sbt/plugins.sbt。如果您需要知道您更改了~/.sbt/plugins/build.sbt:重新启动计算机。请勿触摸任何文件。

另一答案

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

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

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

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

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

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

SBT 插件 %%% 在哪里定义?

IDEA安装Scala插件

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