Как выполнить задачу 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.
Ответы
Ответ 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)