我在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文档所示),因为那时我无法将自定义任务导入其他项目。
答案 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