Go Reject Con 2021で発表した資料です。 スライドの中で使っているサンプルは https://github.com/pyama2000/samle-go-task に上がっています。
go-taskでストレスフリーな 開発体験 Retty株式会社 山下 尚彦 2021/11/24
View Slide
自己紹介 山下 尚彦(やました たかひこ)● バックエンド● 自動化pyama2000https://user.retty.me/4986330/
開発する上での体験 開発する上で実行するコマンド多すぎてツラい 😇シェルスクリプトで開発に必要なコマンドを自動化して開発体験よくしよう!
シェルスクリプトのデメリット ● シェルスクリプトでゴリゴリやるの大変じゃないですか?🤔○ 属人化しやすい○ 修正しようにも処理が複雑で、本人さえ手が入れられない⇒ これらの問題 go-task で解決できます!(行数多いし、処理が複雑だし、メンテナンス大変だなぁ…)
go-taskの特徴 ● 各パッケージマネージャーでインストールできる● YAMLで変数やタスクを定義できるのでメンテナンスしやすい● 依存しているタスクを呼び出せる○ 各タスクが独立している場合、並列に実行できる● ホットリロードがデフォルトで利用できる● ドキュメントが充実している
Taskfile.ymlの書き方(version 3) タスクについて● task コマンドでタスク名を指定して実行する● default タスクは taskコマンドでタスク名を指定しなかったときに呼ばれる● タスク内で desc を定義すると、task --list 実行時に説明を表示できる変数について● vars と env で変数を定義できる○ vars の値は Taskfile.yml 内で利用する○ env の値は Taskfile.yml 内とタスクのコマンド内で利用する
別タスクを実行する データベースを初期化するタスクsql-migrateでデータベースを用意するタスク● task: タスク名 で別タスクを実行できるデータベースを準備するタスク
ホットリロード機能を利用する ● go-taskには -w オプションを付けることでファイルの変更を検知してタスクを再実行する機能(ホットリロード)が利用できる○ 変更を検知したいファイルをsourcesに指定するか、コマンドによって生成されるファイルをgeneratesに指定する必要がある● タスクの再実行は別プロセスで実行されるので注意が必要タスク定義 ホットリロード機能を有効にしたとき
RettyOrderの開発ではどう使われているか? ● google/wire(DIライブラリ)のコードを生成する● GraphQLのスキーマからGoのコードを生成する● golangci-lintによるコードの静的解析 & コードの自動修正をする● 開発に必要なデータベースを用意する● sql-migrateを利用してマイグレートする● データベースからGORMの構造体を生成する
まとめ go-taskのメリット● シェルスクリプトで実現しようとすると複雑な処理になる機能がgo-taskを使うと簡単に利用できる○ タスクを指定して実行できる○ タスク内で別タスクを呼び出せる○ ホットリロード機能が使える● YAMLでタスクを定義できるのでメンテナンスがしやすいRettyでの使われ方● Rettyではgo-taskをRettyOrderの開発で使っている● ホットリロードで再実行したタスクは別プロセスで起動されるので、多重起動を防ぐために前のプロセスを落としてからタスクを実行している● GraphQL用の構造体やデータベースからGORMの構造体を生成するサンプルコード: https://github.com/pyama2000/samle-go-task