Scala 无法从AutoPlugin';运行自定义sbt任务;s命令

Scala 无法从AutoPlugin';运行自定义sbt任务;s命令,scala,sbt,sbt-plugin,Scala,Sbt,Sbt Plugin,我尝试了我能想到的一切,但运行taskB仍然会出现错误消息,即如果我将taskB设置为自定义配置,则taskB未在*/*:taskB或*/cmd:taskB中定义 Command.command("doStuff", Help.more("doStuff", "whatever")) { (state: State) => val e = Project.extract(state) val taskA = taskKey[Seq[String

我尝试了我能想到的一切,但运行taskB仍然会出现错误消息,即如果我将taskB设置为自定义配置,则taskB未在
*/*:taskB
*/cmd:taskB
中定义

Command.command("doStuff", Help.more("doStuff", "whatever")) {
      (state: State) =>
        val e = Project.extract(state)

        val taskA = taskKey[Seq[String]]("A")
        val taskB = taskKey[Seq[File]]("B")

        val cmdConfig = config("cmd")

        val newState = e.append(
          inConfig(cmdConfig)(Seq(
              taskA := {
                // do stuff
              },
              taskB := {
                // do stuff
              }
            )
          )
          , state
        )

        val result: (State, Seq[File]) = e.runTask(taskB in cmdConfig, newState)
)

调试它时,任务似乎不在搜索它的
结构中。data
中。

首先,我假设您只想从命令调用任务,而您并不真正关心是否通过修改该命令中的状态来添加任务

如果是这样的话,我会用更标准的方式来做,就像自动售票机那样

import sbt._
import Keys._

object MyPlugin extends AutoPlugin {

  object autoImport {
    val taskA = taskKey[Seq[String]]("Task A")
    val taskB = taskKey[Seq[File]]("Task B")
  }

  import autoImport._

  val cmdConfig = config("cmd")

  override def projectConfigurations = Seq(cmdConfig)

  // this is optional of course, you can also enable plugin manually
  override def trigger = allRequirements

  override def projectSettings = 
    Seq(commands += doStuffCommand) ++
    inConfig(cmdConfig)(Seq(
      taskA := {
        println("TASK A")
        Seq("A", "B")
      },
      taskB := {
        println("TASK B")
        Seq(file("."))
      }
    ))


  lazy val doStuffCommand =
   Command.command("doStuff", Help.more("doStuff", "whatever")) {
     (state: State) =>
     val e = Project.extract(state)
     val (newState, bResult) = e.runTask(taskB in cmdConfig, state)
     newState
   }

}

此外,您可能根本不需要命令,让一些任务调用另一个任务会更简单。

您需要专门从命令添加任务,还是让命令调用任务?关键是让命令调用它们。如果它没有崩溃(我注释掉e.runTask部分),那么就可以从SBT,standard
*/*:taskB
访问任务。我在e.runTask()中尝试了各种轴组合,但它从未找到任务,我尝试过调试它,但在那里确实很难。lpiepiora你救了我一天,我应该关注插件文档而不是命令文档。我仍然想知道为什么以命令为中心的解决方案不起作用。我需要使用command,因为我正在通过State将服务器实例上的引用从一个命令传递到另一个命令,以便在启动它之后您可以控制它。顺便说一句,请您在
项目配置
中添加一条评论,并解释它的好处是什么?我想如果你想添加一个使用这种配置的设置,你必须在之前“注册”它?顺便问一下,波兰有多少公司在使用Scala?“在捷克共和国仍然只有2分,我预计人们的兴趣会比现在更大。”斯隆说到第1分。是的,您必须告诉sbt您的配置。通常您可以在
project
上执行此操作,如
project.configs(您的配置)
。但是,使用AutoPlugins,您可以使用
projectConfigurations
在插件激活后自动添加它们。所以基本上我认为你可以说你的假设是正确的。关于第二点——很抱歉,我不能详细说明这个事实,因为我不知道。在我工作的公司,我们目前不使用它,这更多的是我的一个爱好,因为我喜欢这种语言的表达能力。您知道如何使用此命令访问生成定义项目类路径吗?如果有人使用此插件/命令,则
runTask(Compile中的fullClasspath,state)
runTask(Runtime中的fullClasspath,state)
和任何其他
键。classpath
只返回没有生成定义项目依赖项的类路径,例如像这样的插件。因此,在有人运行该命令时,我无法访问自己的插件类路径。