如何在使用sbt插件的多项目构建中开发sbt插件?

如何在使用sbt插件的多项目构建中开发sbt插件?,sbt,Sbt,是否可以在多项目设置中构建sbt插件,并在同一多项目的其他子项目中使用该插件 例如: root/ + mySbtPlugin/ + myProject/ + project/ + plugins.sbt // Uses `mySbtPlugin` 这是不可能的,因为为单个或多模块项目定义插件的唯一方法是通过project(meta)构建。当我使用您描述的布局设置沙盒环境时,我再次被欺骗,为您提供了一个解决方案 sbt只允许项目(元)项目位于根目录中。不会处理任何

是否可以在多项目设置中构建sbt插件,并在同一多项目的其他子项目中使用该插件

例如:

root/
+  mySbtPlugin/
+  myProject/
   +  project/
      +  plugins.sbt    // Uses `mySbtPlugin`

这是不可能的,因为为单个或多模块项目定义插件的唯一方法是通过
project
(meta)构建。当我使用您描述的布局设置沙盒环境时,我再次被欺骗,为您提供了一个解决方案

sbt只允许
项目
(元)项目位于根目录中。不会处理任何其他
项目
目录并将其作为生成定义的一部分

这就是为什么您最好(也是唯一)的选择是为
myProject
mybtplugin
构建多模块,以简化您的开发,并且只为您真正想要的项目启用插件(不过要小心)

项目/插件.sbt

lazy val root = (project in file(".")) dependsOn sbtNonamePlugin

lazy val sbtNonamePlugin = ProjectRef(file("../sbt-noname"), "sbt-noname")

addSbtPlugin("pl.japila" % "sbt-noname" % "1.0")
lazy val `my-project`, `sbt-noname` = project
sbtPlugin := true

name := "sbt-noname"

organization := "pl.japila"

version := "1.0"
构建.sbt

lazy val root = (project in file(".")) dependsOn sbtNonamePlugin

lazy val sbtNonamePlugin = ProjectRef(file("../sbt-noname"), "sbt-noname")

addSbtPlugin("pl.japila" % "sbt-noname" % "1.0")
lazy val `my-project`, `sbt-noname` = project
sbtPlugin := true

name := "sbt-noname"

organization := "pl.japila"

version := "1.0"
sbt noname/build.sbt

lazy val root = (project in file(".")) dependsOn sbtNonamePlugin

lazy val sbtNonamePlugin = ProjectRef(file("../sbt-noname"), "sbt-noname")

addSbtPlugin("pl.japila" % "sbt-noname" % "1.0")
lazy val `my-project`, `sbt-noname` = project
sbtPlugin := true

name := "sbt-noname"

organization := "pl.japila"

version := "1.0"
sbt noname/src/main/scala/sbtnoname/Plugin.scala

package sbtnoname

import sbt._
import plugins._

object Plugin extends AutoPlugin {

  override def trigger = allRequirements

  override val projectSettings: Seq[Setting[_]] = inConfig(Test)(baseNonameSettings)

  lazy val sayHello = taskKey[Unit]("Say hello")

  lazy val baseNonameSettings: Seq[sbt.Def.Setting[_]] = Seq(
    sayHello := {
      println("I'm the plugin to say hello")
    }
  )
}
使用上述文件,运行
sbt

> about
[info] This is sbt 0.13.6-SNAPSHOT
[info] The current project is {file:/Users/jacek/sandbox/multi-plugin/}my-project 0.1-SNAPSHOT
[info] The current project is built against Scala 2.10.4
[info] Available Plugins: sbt.plugins.IvyPlugin, sbt.plugins.JvmPlugin, sbt.plugins.CorePlugin, sbt.plugins.JUnitXmlReportPlugin, sbtnoname.Plugin, com.timushev.sbt.updates.UpdatesPlugin
[info] sbt, sbt plugins, and build definitions are using Scala 2.10.4
> projects
[info] In file:/Users/jacek/sandbox/multi-plugin/
[info]   * multi-plugin
[info]     my-project
[info]     sbt-noname
> plugins
In file:/Users/jacek/sandbox/multi-plugin/
    sbt.plugins.IvyPlugin: enabled in multi-plugin, sbt-noname, my-project
    sbt.plugins.JvmPlugin: enabled in multi-plugin, sbt-noname, my-project
    sbt.plugins.CorePlugin: enabled in multi-plugin, sbt-noname, my-project
    sbt.plugins.JUnitXmlReportPlugin: enabled in multi-plugin, sbt-noname, my-project
    sbtnoname.Plugin: enabled in multi-plugin, sbt-noname, my-project
> my-project/test:sayHello
I'm the plugin to say hello
[success] Total time: 0 s, completed Jun 15, 2014 3:49:50 PM