代码之家  ›  专栏  ›  技术社区  ›  Ford O.

SBT:如何定义所有项目的任务?

  •  2
  • Ford O.  · 技术社区  · 6 年前

    我希望能够为我的 sbt.build :

    lazy val project1 = project.in(`.` /  "project1)
       ...
    lazy val project2 = 
       ...
    
    lazy val upload = taskKey[Unit]("upload a config file from project to server)
    upload := { 
       val file = baseDirectory.value / "config.json"
       ...
    }
    

    问题是这个定义只有在我调用 sbt upload ,但我希望能够为每个子项目调用它: sbt project1/upload sbt project2/upload .

    有没有办法不用 inputKey ?

    2 回复  |  直到 6 年前
        1
  •  3
  •   Eugene Yokota    6 年前

    Organizing the build :

    对于更高级的用户,组织构建的另一种方法是定义一次性 auto plugins 在里面 project/*.scala . 通过定义触发插件,自动插件可以作为在所有子项目中注入自定义任务和命令的方便方法。

    项目/uploadplugin.scala

    package something
    
    import sbt._
    import Keys._
    
    object UploadPlugin extends AutoPlugin {
      override def requires = sbt.plugins.JvmPlugin
      override def trigger = allRequirements
    
      object autoImport {
        val upload = taskKey[Unit]("upload a config file from project to server")
      }
      import autoImport._
    
      override lazy val projectSettings = Seq(
        upload := {
          val n = name.value
          println(s"uploading $n..")
        }
      )
    }
    

    建筑.sbt

    以下是您可以使用它的方法:

    ThisBuild / organization := "com.example"
    ThisBuild / scalaVersion := "2.12.5"
    ThisBuild / version      := "0.1.0-SNAPSHOT"
    
    lazy val root = (project in file("."))
      .aggregate(project1, project2)
      .settings(
        name := "Hello"
      )
    
    lazy val project1 = (project in file("project1"))
    
    lazy val project2 = (project in file("project2"))
    

    build.sbt 不用提什么 UploadPlugin 因为它是一个触发的插件。从shell可以调用:

    sbt:Hello> project1/upload
    uploading project1..
    [success] Total time: 0 s, completed Jul 20, 2018
    sbt:Hello> project2/upload
    uploading project2..
    [success] Total time: 0 s, completed Jul 20, 2018
    
        2
  •  -1
  •   C4stor    6 年前

    可以将任务添加为所需项目的设置:

    lazy val uploadTask = {
       lazy val upload = taskKey[Unit]("upload a config file from project to server)
    upload := { 
       val file = baseDirectory.value / "config.json"
       ...
       }
    }
    
    project.in(`.` /  "project1).settings(uploadTask)