Исключить библиотеки зависимостей плагина из выпущенного приложения при упаковке в SBT

В моем проекте SBT я использую плагин sbt-scoverage. Я сделал то, что говорит документация, и добавил ScoverageSbtPlugin.instrumentSettings к build.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?


person Rado Buransky    schedule 08.01.2014    source источник
comment
Может быть, достаточно изменить эту строку на libraryDependencies in scoverage += "com.sksamuel.scoverage" %% "scalac-scoverage-plugin" % ScalacScoveragePluginVersion % scoverage.name, чтобы это исправить?   -  person sksamuel    schedule 08.01.2014
comment
К сожалению нет. Проблема в том, что тогда он не может найти scalac-scoverage-plugin и выдает исключение, говорящее Fatal: scalac-scoverage-plugin not in libraryDependencies. Проверьте ScoverageSbtPlugin.scala, чтобы увидеть подробности.   -  person Rado Buransky    schedule 08.01.2014


Ответы (2)


Как вы заметили, способ написания охвата вынуждает добавлять эту зависимость в libraryDependencies в Compile. Однако одним из обходных путей является использование параметра makePomConfiguration в sbt. Вы можете выполнять преобразования созданного POM, чтобы удалить добавленную зависимость, не влияя на работу покрытия. Ниже я сделал сборку, которая будет отфильтровывать зависимость покрытия в вашем POM. Я использовал файл .scala, поскольку вы не можете определять объекты в build.sbt до версии 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)
    })
}
person danmbyrd    schedule 09.01.2014
comment
Большое спасибо. Приятно знать об этом обходном пути, но все же я был бы рад найти правильное решение. - person Rado Buransky; 10.01.2014
comment
Пожалуйста, проверьте мой собственный ответ. Имеет ли это смысл? Кажется, это работает для меня. - person Rado Buransky; 11.01.2014

Я пришел к следующему решению. Я заменил это:

ivyConfigurations ++= Seq(scoverage, scoverageTest)

с этим:

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

Вот набор изменений: https://github.com/scoverage/sbt-scoverage/commit/6d7ebe07482933f588e9feb23f80eeed2aa14f62

Я был бы признателен за чье-либо мнение по этому поводу. Работает "на моей машине".

person Rado Buransky    schedule 11.01.2014
comment
Кажется, это способ сделать это, если вы хотите сделать более постоянное исправление самого плагина, особенно после прочтения официальной документации по этому вопросу: scala-sbt.org/0.13 .0/документы/ - person danmbyrd; 12.01.2014