【问题标题】:How to develop sbt plugin in multi-project build with projects that use it?如何使用使用它的项目在多项目构建中开发 sbt 插件?
【发布时间】:2014-08-05 09:13:48
【问题描述】:

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

例如:

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

【问题讨论】:

    标签: sbt


    【解决方案1】:

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

    sbt 只允许 project (meta)project 位于根目录中。没有其他project 目录被处理并成为构建定义的一部分。

    这就是为什么您最好(也是唯一)的选择是为myProject 和mySbtPlugin 构建多模块以简化您的开发,并仅为您真正想要的这些项目启用插件(成为不过要小心auto-plugins)。

    project/plugins.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")
    

    build.sbt

    lazy val `my-project`, `sbt-noname` = project
    

    sbt-noname/build.sbt

    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
    

    【讨论】:

      猜你喜欢
      • 2015-06-11
      • 2013-12-20
      • 2013-05-24
      • 2015-02-26
      • 2015-03-11
      • 1970-01-01
      • 2013-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多