Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Sbt:如何为所有项目定义任务?_Scala_Sbt - Fatal编程技术网

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

Scala Sbt:如何为所有项目定义任务?,scala,sbt,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.j

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

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

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)
见:

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

project/UploadPlugin.scala
打包东西
进口sbt_
导入密钥_
对象上载插件扩展了AutoPlugin{
覆盖def requires=sbt.plugins.JvmPlugin
覆盖def触发器=所有要求
对象自动导入{
val upload=taskKey[Unit](“将配置文件从项目上载到服务器”)
}
导入自动导入_
覆盖延迟val项目设置=Seq(
上传:={
val n=name.value
println(s“上传$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

这并没有解决OP将任务注入所有子项目的问题。这不是我理解这个问题的方式,但只要OP找到答案,这其实并不重要。在SBT文档中很难找到有用的信息。谢谢你,尤金!