web-dev-qa-db-fra.com

Comment exécuter un script bash en tant que tâche sbt?

Je veux construire automatiquement la documentation de mon Java Play 2.3 application. Pour le moment, j'utilise un Makefile pour générer des images à partir de *.dotfile et combine les sources Markdown ensemble en Html/PDF:

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

Maintenant, je veux exécuter ces commandes bash simples directement à partir de SBT. Quelle est la meilleure façon de procéder?

J'ai trouvé quelques plugins de documentation SBT dans la référence SBT, mais rien pour exécuter un simple script Shell.

29
Sonson123

Vous pouvez trouver des réponses dans Processus externes dans la documentation officielle de sbt, par ex.

Pour exécuter une commande externe, suivez-la avec un point d'exclamation!:

 "find project -name *.jar" !

N'oubliez pas d'utiliser import scala.sys.process._ alors ! peut être résolu comme une méthode de String.

Procédez comme suit dans la console d'activation ( aka sbt Shell) pour exécuter yourshell.sh - faites attention à la commande eval et aux guillemets autour du nom du script:

eval "yourshell.sh" !

Pour le rendre disponible en tant que tâche, ajoutez ce qui suit à build.sbt de votre projet:

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

execScript := {
  "yourshell.sh" !
}
58
Jacek Laskowski

Nous avions l'obligation d'exécuter certains scripts npm en tant que tâche sbt et de laisser la construction échouer si l'un des scripts npm échoue. Cela m'a pris un peu de temps pour trouver un moyen de créer une tâche qui fonctionne sous Windows et Unix. Et voici donc ce que j'ai trouvé.

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)
22
Steffen