Подтвердить что ты не робот

Как выполнить задачу bash script как sbt?

Я хочу автоматически создавать документацию для своего приложения Java Play 2.3. На данный момент я использую Makefile для создания образов из файлов *.dot и объединяю источники Markdown в Html/PDF:

dot diagram1.dot -Tpdf -o diagram1.pdf
dot diagram2.dot -Tpdf -o diagram2.pdf
pandoc doc1.markdown -o doc1.pdf
# ...

Теперь я хочу запустить эти простые команды bash непосредственно из SBT. Какой лучший способ сделать это?

Я нашел некоторые плагины документации SBT в ссылке SBT, но ничего не запускать простую оболочку script.

4b9b3361

Ответ 1

Вы можете найти ответы в Внешние процессы в официальной документации sbt, например.

Чтобы запустить внешнюю команду, следуйте ей с восклицательным знаком!:

 "find project -name *.jar" !

Сделайте в консоли активатора (aka sbt shell) следующее выполнение yourshell.sh - вспомните команду eval и цитаты вокруг имени script:

eval "yourshell.sh" !

Чтобы он был доступен как задача, добавьте следующее к build.sbt вашего проекта:

lazy val execScript = taskKey[Unit]("Execute the shell script")

execScript := {
  "yourshell.sh" !
}

Ответ 2

У нас было требование выполнить некоторые сценарии npm как задачу sbt и позволить сборке сбой, если один из сценариев npm терпит неудачу. Попробовал немного времени, чтобы найти способ создания задачи, которая работает в Windows и Unix. Итак, вот что я придумал.

lazy val buildFrontend = taskKey[Unit]("Execute frontend scripts")

buildFrontend := {
      val s: TaskStreams = streams.value
      val shell: Seq[String] = if (sys.props("os.name").contains("Windows")) Seq("cmd", "/c") else Seq("bash", "-c")
      val npmInstall: Seq[String] = shell :+ "npm install"
      val npmTest: Seq[String] = shell :+    "npm run test"
      val npmLint: Seq[String] = shell :+    "npm run lint"
      val npmBuild: Seq[String] = shell :+   "npm run build"
      s.log.info("building frontend...")
      if((npmInstall #&& npmTest #&& npmLint #&& npmBuild !) == 0) {
        s.log.success("frontend build successful!")
      } else {
        throw new IllegalStateException("frontend build failed!")
      }
},
(run in Compile) <<= (run in Compile).dependsOn(buildFrontend)