GitHub CLI v2.0 のカスタムコマンドを試す
2021/8/23 に、GitHub CLI 2.0.0 がリリースされました。
$ gh --version
gh version 2.0.0 (2021-08-23)
https://github.com/cli/cli/releases/tag/v2.0.0
新機能には拡張コマンドというものがあり、gh extension
より拡張コマンドを設定できます。
トピックに、gh-extension
を付けて公開している人が多いので、好みの拡張コマンドを探すことができそうです。
拡張コマンドのインストール
使ってみたい拡張コマンドをインストールしてみます。
gh extension install ${OWNER}/${REPOSITORY}
コマンドでインストールできます。
gh-user-status
GitHub ユーザステータスの確認や変更ができる拡張コマンドです。
$ gh extension install vilmibm/gh-user-status
Cloning into '/Users/yumenomatayume/.local/share/gh/extensions/gh-user-status'...
remote: Enumerating objects: 133, done.
remote: Counting objects: 100% (133/133), done.
remote: Compressing objects: 100% (96/96), done.
remote: Total 133 (delta 79), reused 85 (delta 37), pack-reused 0
Receiving objects: 100% (133/133), 12.80 MiB | 12.39 MiB/s, done.
Resolving deltas: 100% (79/79), done.
~/.local/share/gh/extensions
に拡張コマンドのリポジトリが clone されているようです。
インストールが完了したら、使用できるかコマンドを実行して確認してみます。
$ gh user-status get
🏠 Working from home
gh-graph
GitHub の Contribution グラフを、ターミナルで表示できます。こちらもインストールしておきます。
gh extension install kawarimidoll/gh-graph
インストールした拡張コマンドの一覧を出力
gh extension list
コマンドで、インストールした拡張コマンドの一覧がみれます。
$ gh extension list
gh graph kawarimidoll/gh-graph
gh user-status vilmibm/gh-user-status
インストールした拡張コマンドのアップグレード
gh extension upgrade ${OWNER}/${REPOSITORY}
コマンドで、インストールした拡張コマンドをアップグレードできます。
--all
オプションですべての拡張コマンドをアップグレードします。
$ gh extension upgrade --all
[graph]: Already up to date.
[user-status]: Already up to date.
出力をみる限りだと、git pull
しているようです。
インストールした拡張コマンドの削除
gh extension remove ${OWNER}/${REPOSITORY}
コマンドで、インストールした拡張コマンドを削除できます。
$ gh extension remove vilmibm/gh-user-status
✓ Removed extension user-status
拡張コマンドの作成
簡単なものを作成してみました。
GitHub が公開している .gitignore
のテンプレートを、コマンド実行ディレクトリに保存するだけのカスタムコマンドです。
(今まで新規リポジトリで .gitignore
を作成するとき、公開しているリポジトリを見に行ってコピペして〜をしていたので、gh コマンドから簡単に作成できるようにしました。)
作成手順
以下のディレクトリに移動して作業します。
cd ~/.local/share/gh/extensions
拡張コマンドはこのディレクトリにインストールされるので、ここで作業することにより作成中でもコマンド実行できます。
$ gh extension create gitignore
✓ Created directory gh-gitignore
✓ Initialized git repository
✓ Set up extension scaffolding
gh-gitignore is ready for development
Install locally with: cd gh-gitignore && gh extension install .
Publish to GitHub with: gh repo create gh-gitignore
For more information on writing extensions:
https://docs.github.com/github-cli/github-cli/creating-github-cli-extensions
出力にある通り、作成されたリポジトリに移動します。
元々インストールされるディレクトリで作業しているので、ローカルインストールは不要です。
cd gh-gitignore
git init
されており、gh-gitignore
という実行ファイルが存在する状態になっています。
$ git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: gh-gitignore
拡張コマンドを実行したとき、実際にはこのファイルが実行されています。
実行ファイルの内容を書き換えていきます。
#!/bin/bash
type fzf >/dev/null 2>&1
if [[ ! $? = 0 ]]; then
echo -e "error: fzf command is not found.\n\nPlease install fzf command.\n ex) brew install fzf"
exit 1
fi
REPO="github/gitignore"
NAME=$(gh api repos/${REPO}/contents --jq .[].name | grep ".gitignore" | fzf)
if [[ ${NAME} = "" ]];then
echo -e "error: no file selected.\n\nPlease select .gitignore file to download"
exit 1
fi
curl -s https://raw.githubusercontent.com/${REPO}/master/${NAME} > .gitignore
echo "✓ Downloaded ${NAME} to .gitignore"
このカスタムコマンドは、fzf
が必要なので、インストールされていない場合はエラーが返ってくるようになっています。
ファイル内容を書き換えて GitHub に Push すると、一般的な方法で拡張コマンドをインストールできるようになります。
使用方法
拡張コマンドをインストールします。
すでに ~/.local/share/gh/extensions
に配置している場合は不要です。
gh extension install ymmmtym/gh-gitignore
コマンドを実行すると、github/gitignore
にある .gitignore
のテンプレートの一覧が表示されるので、取得したいものを選択してダウンロードできます。
$ gh gitignore
✓ Downloaded Go.gitignore to /tmp/.gitignore
$ cat .gitignore
# Binaries for programs and plugins
*.exe
*.exe~
*.dll
*.so
*.dylib
# Test binary, built with `go test -c`
*.test
# Output of the go coverage tool, specifically when used with LiteIDE
*.out
# Dependency directories (remove the comment below to include it)
# vendor/
さいごに
gh extension
コマンドのよく使うコマンドと、簡単な拡張コマンドを作成してみました。
コマンドには引数やオプションを指定できるので、汎用的なカスタムコマンドを作成できるように活用します。
Reference
Discussion