在SBT文件中添加SBT作为依赖项

时间:2018-03-21 00:52:23

标签: scala sbt

我在scala文件中写了几个sbt任务。这些SBT任务将被导入到许多其他项目中。

lazy val root = (project in file(".")).
  settings(
    inThisBuild(List(
      organization := "com.example",
      scalaVersion := "2.11.8",
      version      := "1.0.0"
    )),
    name := "sbttasks",
    libraryDependencies ++= Seq(
    "org.scala-sbt" % "sbt" % "1.0.0" % "provided"
    )
  )

我收到编译错误

error] java.lang.RuntimeException: Conflicting cross-version suffixes in: org.scala-lang.modules:scala-xml, org.scala-lang.modules:scala-parser-combinators
[error]         at scala.sys.package$.error(package.scala:27)
[error]         at sbt.librarymanagement.ConflictWarning$.processCrossVersioned(ConflictWarning.scala:39)
[error]         at sbt.librarymanagement.ConflictWarning$.apply(ConflictWarning.scala:19)
[error]         at sbt.Classpaths$.$anonfun$ivyBaseSettings$64(Defaults.scala:1995)
[error]         at scala.Function1.$anonfun$compose$1(Function1.scala:44)
[error]         at sbt.internal.util.$tilde$greater.$anonfun$$u2219$1(TypeFunctions.scala:39)
[error]         at sbt.std.Transform$$anon$4.work(System.scala:66)
[error]         at sbt.Execute.$anonfun$submit$2(Execute.scala:262)
[error]         at sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:16)
[error]         at sbt.Execute.work(Execute.scala:271)
[error]         at sbt.Execute.$anonfun$submit$1(Execute.scala:262)
[error]         at sbt.ConcurrentRestrictions$$anon$4.$anonfun$submitValid$1(ConcurrentRestrictions.scala:174)
[error]         at sbt.Completion

我不想在build.sbt本身编写自定义任务(如SBT文档所示),因为那时我无法将自定义任务导入其他项目。

2 个答案:

答案 0 :(得分:4)

编写可重复使用的任务,您可以"导入"在不同的项目中,您需要制作sbt plugin

如果您有multi-project build并希望在子项目中重复使用您的任务,则可以使用

创建文件application.properties custom-app.enable-mocks = false @Value("${custom-app.enable-mocks}") private boolean enableMocks;
project/MyPlugin.scala

然后在子项目中启用此插件(即使这些任务可用),您可以在import sbt._ import sbt.Keys._ object MyPlugin extends AutoPlugin { override def trigger = noTrigger object autoImport { val fooTask = taskKey[Foo]("Foo description") val barTask = taskKey[Bar]("Bar description") } import autoImport._ override lazy val projectSettings = Seq( fooTask := { ??? }, barTask := { ??? } ) } 中写下这个:

build.sbt

相比之下,如果要在其他不相关的项目中重用这些任务,则需要将此插件作为单独的项目并将其发布。它是一个普通的sbt项目,但是你可以用lazy val subproject = (project in file("subproject")) .enablePlugins(MyPlugin) 写一个明确的sbt依赖项:

build.sbt

定义任务的代码转到sbtPlugin := true (就像在正常项目中一样)。

您可以在sbt documentation中详细了解如何编写插件。

答案 1 :(得分:0)

“org.scala-sbt”的版本更改为“1.0.0-M4”

lazy val root = (project in file(".")).
  settings(
    inThisBuild(List(
      organization := "com.example",
      scalaVersion := "2.11.8",
      version      := "1.0.0",
      name := "sbttasks"
    )),
    libraryDependencies ++= Seq(
        "org.scala-sbt" % "sbt" % "1.0.0-M4" % "provided"
    )
  )

用于整个兼容性矩阵检查 https://mvnrepository.com/artifact/org.scala-sbt/main