1

在我的 SBT 项目中,我使用sbt-scoverage插件。我做了文档所说的并添加ScoverageSbtPlugin.instrumentSettingsbuild.sbt. 到目前为止一切都很好。

当我package的应用程序出现时,我可以看到pom.xml不应该存在的依赖项:

<dependency>
  <groupId>com.sksamuel.scoverage</groupId>
  <artifactId>scalac-scoverage-plugin</artifactId>
  <version>0.95.4</version>
</dependency>

这是 sbt-scoverage 插件的库依赖项,我不想在已发布的应用程序中将其作为依赖项。

我相信这种依赖关系是由ScoverageSbtPlugin.scala中的以下代码创建的:

libraryDependencies += "com.sksamuel.scoverage" %% "scalac-scoverage-plugin" %
    ScalacScoveragePluginVersion % scoverage.name

谁能告诉我如何仅在我运行时添加此依赖项sbt scoverage:test

4

2 回答 2

2

我来到以下解决方案。我已经替换了这个:

ivyConfigurations ++= Seq(scoverage, scoverageTest)

有了这个:

ivyConfigurations ++= Seq(scoverage hide, scoverageTest hide)

这是变更集: https ://github.com/scoverage/sbt-scoverage/commit/6d7ebe07482933f588e9feb23f80eeed2aa14f62

我会很感激任何人对此的看法。它“在我的机器上”工作。

于 2014-01-11T18:45:18.130 回答
2

正如您所注意到的,似乎编写覆盖范围的方式强制将此依赖项添加到编译中的 libraryDependencies 中。然而,一种解决方法是使用 sbt 中的 makePomConfiguration 设置。您可以对构建的 POM 执行转换以删除添加的依赖项,而不会影响覆盖的工作方式。下面我做了一个构建,它将过滤掉你的 POM 中的覆盖依赖。我使用了 .scala 文件,因为您无法在 build.sbt pre 0.13 中定义对象。所以这个文件将位于 project/Build.scala。

import sbt.Keys._
import sbt._
import scala.xml.{Elem, Node}
import scala.xml.transform.{RuleTransformer, RewriteRule}

object theBuild extends Build {

  object FilterBadDependency extends RewriteRule {

      override def transform(n: Node): Seq[Node] = n match {
        /**
         * When we find the dependencies node we want to rewrite it removing any of
         * the scoverage dependencies.
         */
        case dependencies @ Elem(_, "dependencies", _, _, _*) =>
          <dependencies>
            {
              dependencies.child filter { dep =>
                (dep \ "groupId").text != "com.sksamuel.scoverage"
              }
            }
          </dependencies>

        /**
         * Otherwise we just skip over the node and do nothing
         */
        case other => other
      }

  }

  object TransformFilterBadDependencies extends RuleTransformer(FilterBadDependency)

  val project = Project(
    id = "test-build",
    base = file(".")
  ).settings(
      ScoverageSbtPlugin.instrumentSettings: _*
  ).settings(
      /**
       * Here we alter our make pom configuration so that our transformation is applied to
       * the constructed pom
       */
    makePomConfiguration ~= { config =>
      config.copy(process = TransformFilterBadDependencies)
    })
}
于 2014-01-09T21:05:08.577 回答