Sbt:如何为所有项目定义任务?

For*_* O. 3 scala sbt

我希望能够为我的所有项目定义一个任务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"
   ...
}
Run Code Online (Sandbox Code Playgroud)

问题在于此定义仅在调用时有效sbt upload,但我希望能够为每个子项目调用它:sbt project1/uploadsbt project2/upload

有没有办法做到这一点,而无需使用inputKey

Eug*_*ota 5

请参阅组织构建

对于更高级的用户,您的组织构建的另一种方式是定义一次性自动插件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..")
    }
  )
}
Run Code Online (Sandbox Code Playgroud)

build.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"))
Run Code Online (Sandbox Code Playgroud)

build.sbt无需提及任何有关的信息UploadPlugin,因为它是一个触发插件。从外壳程序可以调用:

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
Run Code Online (Sandbox Code Playgroud)