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

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/uploadsbt project2/upload
有没有一种方法可以做到这一点,而不使用inputKey
2个回答

9

请参见组织构建文档:

对于更高级的用户,另一种组织构建的方式是在project/*.scala中定义单独的自动插件。通过定义触发器插件,自动插件可以方便地注入自定义任务和命令到所有子项目中。

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

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"))

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

1
在 SBT 文档中找到有用的信息真的很难。谢谢 Eugene! - YSC

-3
您可以将任务添加为您想要的项目的设置:
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)

1
这并没有解决提问者关于将任务注入到“所有”子项目的问题。 - Eugene Yokota
这不是我理解的问题,但只要原帖作者找到答案,那么无论如何都没关系。 - C4stor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接