【问题标题】:Using a 2.10-only SBT plugin in a project that's cross-built against 2.9在与 2.9 交叉构建的项目中使用仅限 2.10 的 SBT 插件
【发布时间】:2014-08-24 20:56:18
【问题描述】:

假设我有一个针对 Scala 2.9.3 和 2.10.4 交叉构建的 SBT 0.13 项目。我只想为 2.10 构建使用 SBT 插件 (sbt-coveralls),因为该插件不适用于 2.9。

我知道我可以使用CrossVersion 有条件地将插件设置添加到 2.10 版本,但这无助于addSbtPlugin 不会为 2.9 版本等找到任何东西。

我假设这是不可能的(缺少一些非常混乱的临时 shell 脚本),但我不是 SBT 向导,如果能一次以一种好的方式对 SBT 的奥秘感到惊讶,那就太好了.

【问题讨论】:

  • 只是一个旁注——我认为这个问题更加复杂。我认为您不能使用CrossVersion 有条件地添加设置。
  • @lpiepiora:我正在关注this demo project,这部分似乎工作得很好。
  • Here CrossVersion 在设置宏中使用,scalaVersion.value 可以使用。您想在宏之外使用它。我关注了github discussion,但我认为那里建议的解决方案不会奏效。

标签: scala sbt


【解决方案1】:

找到了这个可怕的解决方法,但它似乎确实有效:

resolvers <++= scalaVersion {
  case v if v startsWith( "2.12" ) =>
    Seq.empty

  case _ =>
    addSbtPlugin( "org.scoverage" % "sbt-scoverage" % "1.0.4" )
    addSbtPlugin( "org.scoverage" % "sbt-coveralls" % "1.0.0" )
    Seq( Classpaths.sbtPluginReleases )
}

【讨论】:

  • 这样做的问题是,如果您在 build.sbt 上有任何覆盖设置,那么构建将失败。
  • 我在一个启用了覆盖的项目上成功使用了这个 hack,但也许我错过了什么?
  • 你的 build.sbt 上是否有任何 scoverage 密钥?
  • 姗姗来迟,但不,我没有。您的评论很到位。
【解决方案2】:

我可能误解了这个问题,但我认为您可能会对 sbt 与项目版本的 Scala 混淆。

您不能使用与 sbt 不兼容的插件 - 运行时。如果插件不支持 sbt 在幕后使用的 Scala 版本,则该插件被视为不兼容,因此 sbt 将拒绝启动。 sbt 0.13.5 使用 2.10.4,所以插件只能使用 Scala API 2.10.4。这就是addSbtPlugin 不提供%% 的原因。

对于项目,情况有所不同。在这里,您可以使用任何您想要的版本,而不管 sbt 使用的版本以及插件。一旦你 addSbtPlugin'ed 一个插件,这个插件就可以在项目中使用,要启用它,请将设置添加到项目中。

【讨论】:

  • 谢谢你的回答,但我想我现在更困惑了——在this branch of Scalding,如果你把scalaVersion从2.10.4切换到2.9.3,你会得到一个unresolved dependency: org.scoverage#scalac-scoverage-plugin_2.9.3... .它也确实在addSbtPlugin 中使用了%%(尽管切换到% 似乎没有什么区别)。
  • 您看到的错误是因为 sbt-scoverage 正在修改 libraryDependencies 设置——这对于插件来说是非常不寻常的,但我想在这种情况下它是有道理的。至于为什么 scoveralls 使用%%,我没有仔细看代码的猜测是它们提供的版本基于 sbt 本身使用的 Scala 版本略有不同。
  • 更清楚地说,您所看到的是相当不寻常的——这个插件(实际上是插件)对项目设置进行了比您通常看到的插件所做的更具侵入性的更新。考虑到所需的仪器,这也许是合理的。
猜你喜欢
  • 2013-11-07
  • 2019-05-12
  • 2013-05-24
  • 2015-11-14
  • 2014-08-05
  • 1970-01-01
  • 2015-03-29
  • 1970-01-01
  • 2021-02-05
相关资源
最近更新 更多