共有ライブラリを管理するために Sonatype の Nexus Repository Manager OSS を使用する ( 番外編 )( build.gradle にコマンドを書いて実行する )
概要
外部ライブラリに依存するライブラリの作り方を調べるためにいろいろなライブラリの GitHub を見ていたのですが、spock の build.gradle ( https://github.com/spockframework/spock/blob/master/build.gradle ) を見た時に commandLine "sh", "-c", """..."""
という記述を見つけました。Gradle からコマンドをそのまま実行できるとは初めて知りました。
使い方が分かると結構便利そうに思えたのと、spock の build.gradle は Linux 上で sh で実行する前提で Windows の場合にはどうすればよいのか分からなかったので、調べてみます。
参照したサイト・書籍
- Gradle Build Language Reference - Exec
https://docs.gradle.org/current/dsl/org.gradle.api.tasks.Exec.html
目次
- cmd.exe で1行コマンドを実行する
- cmd.exe では
"""..."""
でコマンドを実行できない。。。 - .bat ファイルを実行する
- Git for Windows の bash.exe を利用して
"""..."""
で複数コマンドを実行する - plugin を利用せずに git コマンドを実行する
本題
cmd.exe で1行コマンドを実行する
ksbysample-nexus-repomng/ksbysample-webapp-demo プロジェクトの build.gradle にタスクを追加して試します。
Windows なので cmd.exe だろうと思い、最初に以下のタスクを作成してみました。
task sampleTask(type: Exec) { commandLine "cmd.exe", "/C", "echo hello > hello.txt" }
Gradle projects View の左上にある「Refresh all Gradle projects」ボタンをクリックして build.gradle を反映します。「other」の下に「sampleTask」が表示されます。
「sampleTask」を実行すると "BUILD SUCCESSFUL" が表示され、
ksbysample-webapp-demo プロジェクトのルートディレクトリである C:\project-springboot\ksbysample-nexus-repomng\ksbysample-webapp-demo の下に hello.txt が出力されていました。
作成された hello.txt は一旦削除します。
cmd.exe では """..."""
でコマンドを実行できない。。。
次に build.gradle の sampleTask を """..."""
の形式に変更してみます。
task sampleTask(type: Exec) { commandLine "cmd.exe", "/C" """ echo hello > hello.txt """ }
「sampleTask」を実行すると "BUILD SUCCESSFUL" は表示されるのですが、hello.txt は作成されませんでした。
"""..."""
の記述で複数コマンドを実行できるようにはできないようです。推測ですが、cmd.exe にはヒアドキュメントの機能がないためと思われます。
.bat ファイルを実行する
1行コマンドは実行できるので、.bat ファイルを作成すれば複数コマンドも実行できるのではないか、と思いました。試してみます。
まず ksbysample-webapp-demo プロジェクトのルートディレクトリに以下の内容の hello.bat を作成します。
echo hello > hello.txt echo sample >> hello.txt
次に build.gradle の sampleTask を hello.bat を実行するよう変更します。
task sampleTask(type: Exec) { commandLine "cmd.exe", "/C", "call hello.bat" }
「sampleTask」を実行すると hello.bat 内のコマンドが1行ずつ実行されていると思われるログが出力されて、最後に "BUILD SUCCESSFUL" が表示されました。
ksbysample-webapp-demo プロジェクトのルートディレクトリには hello.txt が出力されており、hello.bat に記述した内容が出力されていました。
.bat ファイルを作成すれば cmd.exe でも複数コマンドを実行できるようにはなりますね。hello.bat, hello.txt は削除します。
Git for Windows の bash.exe を利用して """..."""
で複数コマンドを実行する
build.gradle の記述だけで複数コマンドを実行する方法がないかを考えてみます。Windows でも bash が利用できればよいと思われるので、Git for Windows に入っている bash.exe を利用すればよい気がします。試してみます。
まず環境変数 PATH に Git for Windows の bash.exe があるディレクトリを追加します。自分の環境では C:\Git\usr\bin に bash.exe があるので、C:\Git\usr\bin を PATH に追加します。
コマンドプロンプトを起動して bash コマンドが実行できることを確認します。
build.gradle の sampleTask を以下のように変更します。
task sampleTask(type: Exec) { commandLine "bash.exe", "-c", """ echo hello > hello.txt echo sample >> hello.txt """ }
「sampleTask」を実行すると "BUILD SUCCESSFUL" が表示されました。
hello.txt も作成されていました。
hello.txt は削除します。
Git for Windows の bash.exe を利用すれば build.gradle の記述だけで複数コマンドを実行できますね。
plugin を利用せずに git コマンドを実行する
これまで build.gradle から Git コマンドを実行するには org.ajoberstar:grgit
を利用していたのですが、上の方法が実現できるのであれば plugin を利用せずに git コマンドが呼び出せると思われます。試してみます。
build.gradle の sampleTask を以下のように変更します。
task sampleTask(type: Exec) { commandLine "bash.exe", "-c", """ git checkout develop git branch feature/xxx-issue git checkout feature/xxx-issue mkdir src/main/resources/META-INF touch src/main/resources/META-INF/.gitkeep git add -A git commit -m 'META-INF ディレクトリを作成しました' """ }
※"""..."""
の中で git commit 等でメッセージ文字列を指定する場合、シングルクォーテーションで囲みます。
「sampleTask」を実行する前の Git のリポジトリは以下の状態です。
「sampleTask」を実行すると "BUILD SUCCESSFUL" が表示されました。
SourceTree で Git のリポジトリを見ると、feature/xxx-issue ブランチが作成されてファイルが commit されていました。
作成した feature/xxx-issue ブランチは削除します。
結論としては Windows でも問題なく使用できそうです。コマンドを直接実行できるようになるといろいろやれることが増えそうですね。