【问题标题】:Sbt: How to define task for all projects?Sbt:如何为所有项目定义任务?
【发布时间】:2018-07-20 14:01:02
【问题描述】:

我希望能够在我的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

【问题讨论】:

    标签: scala sbt


    【解决方案1】:

    Organizing the build:

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

    项目/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
    

    【讨论】:

    • 在 SBT 文档中很难找到有用的信息。谢谢尤金!
    【解决方案2】:

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

    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)
    

    【讨论】:

    • 这并没有解决 OP 将任务注入到 all 子项目的问题。
    • 我不是这么理解这个问题的,但是只要OP找到答案,无论如何都无所谓
    猜你喜欢
    • 2015-07-24
    • 1970-01-01
    • 2015-01-18
    • 2018-05-05
    • 2017-06-15
    • 2017-07-04
    • 2014-06-18
    • 2013-03-06
    • 2015-09-13
    相关资源
    最近更新 更多