この記事は ゆめみ Advent Calendar 2021 の 5 日目の記事です。
はじめに
みなさんは、Kotlin のスクリプト言語としての機能を使ったことはありますか?
Android アプリの開発で .kts
という拡張子のファイルを Gradle で使っているよ!という方は、ちょっぴりいるのかなと思います。
以前は、サポート機能がまだまだ少なく、IDEA のコード補完も効かないなどありましたが、最近、どんどん強化・改善がされ、少しずつ使いやすくなってきました。
GitHub Actions に Kotlin がプリインストールされていて、せっかくなので APK の差分を抽出してみました
成果物
※ GitHub Marketplace へも近日リリース予定です
実際の動作
スクリプト言語としての機能について
さよなら Gradle
Gradle ファイルは必要ありません
ライブラリを使いたいときは?
// ライブラリをインストールしてくるリポジトリを記載
@file:Repository("https://repo1.maven.org/maven2/")
// 使用するライブラリを記載
@file:DependsOn("eu.jrie.jetbrains:kotlin-shell-core:0.2.1")
// ライブラリで使用するものを記載
import eu.jrie.jetbrains.kotlinshell.shell.*
ファイルの数が増えなくて快適です
シェルコマンドを実行したい場合はどうするの?
公式でのドキュメントは見つかりませんでしたが、以下のライブラリを使って解決しました
書き方はいろいろありますが、こんな感じで書けます
shell {
"echo hello"()
}
shell {
val echo = systemProcess {
cmd { "echo" withArg "hello" }
}
echo()
}
shell {
val echo = "echo hello".process()
echo()
}
ライブラリの作成者に感謝
APK の差分の抽出
Android SDK のコマンドラインツールに含まれている apkanalyzer を利用します
GitHub Actions には Android SDK のコマンドラインツールもプリインストールされているため、自分でインストールする必要がないのはいいですね
Kotlin の恩恵
apkanalyzer の結果をゴニョゴニョしたい時にとても恩恵を感じました。
以下のコードは「タブ文字を "|" に変換して、 差分が~Bと表示されているものは除外する」という処理です。
これをシェルスクリプトでやろうとするとけっこう大変ですよね
(日常的にシェルスクリプトを触っている方であればそうでもないのでしょうか。。)
val compare =
result("apkanalyzer -h apk compare --different-only $baseApkPath $targetApkPath")
.replace("\t", "|")
.split("\n")
.filter { !it.contains("""\dB.+$""".toRegex()) }
.joinToString("\n")
おわりに
Kotlin のスクリプト言語機能を活用して、とても快適に GitHub Actions を開発することができました。
今後もどんどん活用していこうと思います
ぜひ、みなさんも Kotlin のスクリプト言語機能をご活用ください!
参考