如果您有一个带有"项目P和两个子项目A和B"的多项目构建配置,则归结为以下配置:
build.sbt
lazy val A, B = project
根据设计,"如果没有为构建中的根目录定义项目,则sbt会创建一个默认的项目来聚合构建中的所有其他项目." 这意味着你将有一个隐含的根项目,比如说P
(但名称是任意的):
[plugin-project-and-another]> projects [info] In file:/Users/jacek/sandbox/so/plugin-project-and-another/ [info] A [info] B [info] * plugin-project-and-another
这为我们提供了预期的项目结构.关于定义B
和之间的插件依赖性A
.
在SBT项目定义插件的唯一方法就是使用project
目录这就是plugins
项目的构建定义- "一个插件定义为<主要项目> /项目/项目." 这意味着定义项目插件依赖项的唯一方法A
是使用以下方法:
项目/ plugins.sbt
addSbtPlugin("org.example" % "example-plugin" % "1.0") lazy val plugins = project in file(".") dependsOn(file("../A"))
在这个构建配置中,plugins
项目依赖于另一个SBT项目,而这个项目恰好是我们A
的插件项目.
A/build.sbt
// http://www.scala-sbt.org/release/docs/Extending/Plugins.html#example-plugin sbtPlugin := true name := "example-plugin" organization := "org.example" version := "1.0"
A/MyPlugin.scala
import sbt._ object MyPlugin extends Plugin { // configuration points, like the built in `version`, `libraryDependencies`, or `compile` // by implementing Plugin, these are automatically imported in a user's `build.sbt` val newTask = taskKey[Unit]("A new task.") val newSetting = settingKey[String]("A new setting.") // a group of settings ready to be added to a Project // to automatically add them, do val newSettings = Seq( newSetting := "Hello from plugin", newTask := println(newSetting.value) ) // alternatively, by overriding `settings`, they could be automatically added to a Project // override val settings = Seq(...) }
这两个文件 - build.sbt
以及MyPlugin.scala
目录中的A
- 构成了插件项目.
唯一缺少的是定义项目的插件A
设置B
.
B/build.sbt
MyPlugin.newSettings
这就是你在SBT中可以做的事情.如果您想拥有多项目构建配置并且(子)项目之间具有插件依赖性,除了上面描述的内容之外,您没有太多选择.
话虽如此,让我们看看项目中的插件A
是否可访问.
[plugin-project-and-another]> newTask Hello from plugin [success] Total time: 0 s, completed Feb 13, 2014 2:29:31 AM [plugin-project-and-another]> B/newTask Hello from plugin [success] Total time: 0 s, completed Feb 13, 2014 2:29:36 AM [plugin-project-and-another]> A/newTask [error] No such setting/task [error] A/newTask [error] ^
您可能已经注意到,newTask
(来自项目的插件A
)可以在(默认)根项目和项目中使用B
,但不能在A
.
如果您有一个带有"项目P和两个子项目A和B"的多项目构建配置,则归结为以下配置:
build.sbt
lazy val A, B = project
根据设计,"如果没有为构建中的根目录定义项目,则sbt会创建一个默认的项目来聚合构建中的所有其他项目." 这意味着你将有一个隐含的根项目,比如说P
(但名称是任意的):
[plugin-project-and-another]> projects [info] In file:/Users/jacek/sandbox/so/plugin-project-and-another/ [info] A [info] B [info] * plugin-project-and-another
这为我们提供了预期的项目结构.关于定义B
和之间的插件依赖性A
.
在SBT项目定义插件的唯一方法就是使用project
目录这就是plugins
项目的构建定义- "一个插件定义为<主要项目> /项目/项目." 这意味着定义项目插件依赖项的唯一方法A
是使用以下方法:
项目/ plugins.sbt
addSbtPlugin("org.example" % "example-plugin" % "1.0") lazy val plugins = project in file(".") dependsOn(file("../A"))
在这个构建配置中,plugins
项目依赖于另一个SBT项目,而这个项目恰好是我们A
的插件项目.
A/build.sbt
// http://www.scala-sbt.org/release/docs/Extending/Plugins.html#example-plugin sbtPlugin := true name := "example-plugin" organization := "org.example" version := "1.0"
A/MyPlugin.scala
import sbt._ object MyPlugin extends Plugin { // configuration points, like the built in `version`, `libraryDependencies`, or `compile` // by implementing Plugin, these are automatically imported in a user's `build.sbt` val newTask = taskKey[Unit]("A new task.") val newSetting = settingKey[String]("A new setting.") // a group of settings ready to be added to a Project // to automatically add them, do val newSettings = Seq( newSetting := "Hello from plugin", newTask := println(newSetting.value) ) // alternatively, by overriding `settings`, they could be automatically added to a Project // override val settings = Seq(...) }
这两个文件 - build.sbt
以及MyPlugin.scala
目录中的A
- 构成了插件项目.
唯一缺少的是定义项目的插件A
设置B
.
B/build.sbt
MyPlugin.newSettings
这就是你在SBT中可以做的事情.如果您想拥有多项目构建配置并且(子)项目之间具有插件依赖性,除了上面描述的内容之外,您没有太多选择.
话虽如此,让我们看看项目中的插件A
是否可访问.
[plugin-project-and-another]> newTask Hello from plugin [success] Total time: 0 s, completed Feb 13, 2014 2:29:31 AM [plugin-project-and-another]> B/newTask Hello from plugin [success] Total time: 0 s, completed Feb 13, 2014 2:29:36 AM [plugin-project-and-another]> A/newTask [error] No such setting/task [error] A/newTask [error] ^
您可能已经注意到,newTask
(来自项目的插件A
)可以在(默认)根项目和项目中使用B
,但不能在A
.