かんがるーさんの日記

最近自分が興味をもったものを調べた時の手順等を書いています。今は Spring Boot をいじっています。

共有ライブラリを管理するために 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 の場合にはどうすればよいのか分からなかったので、調べてみます。

参照したサイト・書籍

  1. Gradle Build Language Reference - Exec
    https://docs.gradle.org/current/dsl/org.gradle.api.tasks.Exec.html

目次

  1. cmd.exe で1行コマンドを実行する
  2. cmd.exe では """...""" でコマンドを実行できない。。。
  3. .bat ファイルを実行する
  4. Git for Windows の bash.exe を利用して """...""" で複数コマンドを実行する
  5. 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」が表示されます。

f:id:ksby:20160806120359p:plain

「sampleTask」を実行すると "BUILD SUCCESSFUL" が表示され、

f:id:ksby:20160806120951p:plain

ksbysample-webapp-demo プロジェクトのルートディレクトリである C:\project-springboot\ksbysample-nexus-repomng\ksbysample-webapp-demo の下に hello.txt が出力されていました。

f:id:ksby:20160806121414p:plain f:id:ksby:20160806121220p:plain

作成された hello.txt は一旦削除します。

cmd.exe では """...""" でコマンドを実行できない。。。

次に build.gradle の sampleTask を """...""" の形式に変更してみます。

task sampleTask(type: Exec) {
    commandLine "cmd.exe", "/C"
"""
    echo hello > hello.txt
"""
}

「sampleTask」を実行すると "BUILD SUCCESSFUL" は表示されるのですが、hello.txt は作成されませんでした。

f:id:ksby:20160806152451p:plain

"""...""" の記述で複数コマンドを実行できるようにはできないようです。推測ですが、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" が表示されました。

f:id:ksby:20160806153635p:plain

ksbysample-webapp-demo プロジェクトのルートディレクトリには hello.txt が出力されており、hello.bat に記述した内容が出力されていました。

f:id:ksby:20160806153858p:plain f:id:ksby:20160806153947p:plain

.bat ファイルを作成すれば cmd.exe でも複数コマンドを実行できるようにはなりますね。hello.bat, hello.txt は削除します。

Git for Windowsbash.exe を利用して """...""" で複数コマンドを実行する

build.gradle の記述だけで複数コマンドを実行する方法がないかを考えてみます。Windows でも bash が利用できればよいと思われるので、Git for Windows に入っている bash.exe を利用すればよい気がします。試してみます。

まず環境変数 PATH に Git for Windowsbash.exe があるディレクトリを追加します。自分の環境では C:\Git\usr\bin に bash.exe があるので、C:\Git\usr\bin を PATH に追加します。

コマンドプロンプトを起動して bash コマンドが実行できることを確認します。

f:id:ksby:20160806155556p:plain

build.gradle の sampleTask を以下のように変更します。

task sampleTask(type: Exec) {
    commandLine "bash.exe", "-c",
"""
    echo hello > hello.txt
    echo sample >> hello.txt
"""
}

「sampleTask」を実行すると "BUILD SUCCESSFUL" が表示されました。

f:id:ksby:20160806161418p:plain

hello.txt も作成されていました。

f:id:ksby:20160806161651p:plain f:id:ksby:20160806161742p:plain

hello.txt は削除します。

Git for Windowsbash.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 のリポジトリは以下の状態です。

f:id:ksby:20160806162927p:plain

「sampleTask」を実行すると "BUILD SUCCESSFUL" が表示されました。

f:id:ksby:20160806164834p:plain

SourceTree で Git のリポジトリを見ると、feature/xxx-issue ブランチが作成されてファイルが commit されていました。

f:id:ksby:20160806165028p:plain

作成した feature/xxx-issue ブランチは削除します。

結論としては Windows でも問題なく使用できそうです。コマンドを直接実行できるようになるといろいろやれることが増えそうですね。