我正在尝试创建一个SBT插件,为我的组织的项目提供常见的插件和设置(类似于Maven父POM)。 由于大多数这些设置也应该存在于commons项目本身中,我将这些源添加为plugins.sbt中的unmanagedSourceDirectories,因此我为正确的项目定义的自动插件也存在于元项目中(我采取了一个巧妙的技巧)来自sbt-release插件)。
事情很好,除了我需要复制addSbtPlugin条目时,我想要一个插件用于展示我的正确项目和元项目。如果我不这样做,我的正确项目将无法编译,因为没有加载插件的类。
我尝试将所有共享插件依赖项移动到一个单独的autoplugin,假设SBT会编译它并将库依赖项添加到元项目中,这样当我的常用插件编译时它们就会存在,但它不起作用。 / p>
我想理解为什么这会失败,并且如果思考者有某种方式使用编译顺序以某种方式使其工作。如果没有,我很乐意听到你们知道的任何替代方案,以避免维护我所有共享插件的重复版本。
以下是我的代码的简化版本:
项目结构
/common
|-build.sbt
|-/project
| |-plugins.sbt
|-/src/main/scala/package
|-Dependencies.scala
|-MyCommonPlugin.scala
build.sbt
sbtPlugin := true
name := "common"
plugins.sbt
unmanagedSourceDirectories in Compile += baseDirectory.value.getParentFile / "src" / "main" / "scala"
Dependencies.scala
import sbt._
import sbt.Keys._
//Plugins I intend to share between build.sbt and plugins.sbt
object Dependencies extends AutoPlugin {
override def trigger = allRequirements
override lazy val projectSettings = super.projectSettings ++ Seq(
addSbtPlugin("com.typesafe.sbt" % "sbt-git" % "0.8.5")
)
}
MyCommonPlugin.scala
import sbt._
import sbt.Keys._
//this import fails! object sbt is not a member of package com.typesafe
import com.typesafe.sbt.GitBranchPrompt.{ projectSettings => gitBranchPromptSettings }
object MyCommonPlugin extends AutoPlugin {
override def trigger = allRequirements
override lazy val projectSettings =
super.projectSettings ++
gitBranchPromptSettings ++
Seq(
// My common settings
)
}
要使此代码正常工作,我需要在plugins.sbt上重复addSbtPlugin("com.typesafe.sbt" % "sbt-git" % "0.8.5")
。