【问题标题】:How to execute a task or command after another task even if it failed即使失败,如何在另一个任务之后执行任务或命令
【发布时间】:2020-10-08 18:52:56
【问题描述】:

我在 sbt 中有一个相当长的运行任务,希望在完成后收到声音通知,即使失败了。我是带着这种粗鲁的部分到达那里的:

lazy val ding = taskKey[Unit]("plays a ding sound")
ding := {
  Seq("play", "-q", "/…/SmallGlockA.wav").run
}

我像这样调用上述任务:

sbt> ;test;ding

虽然如果任务成功,这很好用,但如果任务失败,它当然不会播放声音,考虑到它是测试,这很可能。

有什么想法可以解决这个问题吗?它不必非常漂亮或超级健壮——这不会被承诺,这对我来说只是本地的事情。

【问题讨论】:

    标签: scala sbt


    【解决方案1】:

    我想出的解决方案是为 sbt 创建一个 AutoPlugin 来满足您的需求。

    project文件夹中创建一个名为DingPlugin.scala的新文件,内容如下

    import sbt.Keys._
    import sbt.PluginTrigger.AllRequirements
    import sbt._
    
    object DingPlugin extends AutoPlugin {
    
      private def wavPath = "/path/to/wav"
      private def playSound(wav: String) = ???
    
      override def trigger = AllRequirements
    
      override def projectSettings: Seq[Def.Setting[_]] = Seq(
        Test / test := (Test / test).andFinally(playSound(wavPath)).value
      )
    }
    

    重点是方法andFinallythat

    定义一个新任务,它运行原始任务并评估副作用,无论原始任务是否成功。任务的结果就是原任务的结果

    playSound的实现派生自这个question,代码如下

      private def playSound(wav: String): Unit = {
        import java.io.BufferedInputStream
        import java.io.FileInputStream
        import javax.sound.sampled.AudioSystem
        val clip = AudioSystem.getClip
        val inputStream =
          AudioSystem.getAudioInputStream(
            new BufferedInputStream(new FileInputStream(wav))
          )
        clip.open(inputStream)
        clip.start()
        Thread.sleep(clip.getMicrosecondLength / 1000)
      }
    

    现在,您只需运行sbt test,无论测试成功与否,它都会播放声音。

    【讨论】:

      猜你喜欢
      • 2017-09-07
      • 1970-01-01
      • 2020-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-09
      • 1970-01-01
      相关资源
      最近更新 更多