{"meta":{"title":"GitHub CLI 拡張機能の作成","intro":"GitHub CLI のカスタム拡張機能を作成して、新しい GitHub CLI コマンドを他のユーザーと共有する方法について学びます。","product":"GitHub CLI","breadcrumbs":[{"href":"/ja/github-cli","title":"GitHub CLI"},{"href":"/ja/github-cli/github-cli","title":"GitHub CLI"},{"href":"/ja/github-cli/github-cli/creating-github-cli-extensions","title":"GitHub CLI 拡張機能の作成"}],"documentType":"article"},"body":"# GitHub CLI 拡張機能の作成\n\nGitHub CLI のカスタム拡張機能を作成して、新しい GitHub CLI コマンドを他のユーザーと共有する方法について学びます。\n\n## GitHub CLI 拡張機能について\n\nGitHub CLI 拡張機能は、だれでも作成して使用できる、カスタム GitHub CLI コマンドです。GitHub CLI 拡張機能の使用方法の詳細については、「[GitHub CLI 拡張機能の使用](/ja/github-cli/github-cli/using-github-cli-extensions)を参照してください。\n\n作成する拡張機能ごとにリポジトリが必要です。 リポジトリ名は `gh-` で始まる必要があります。 リポジトリ名の残りの部分は拡張機能の名前です。 リポジトリのルートには、リポジトリと同じ名前の実行可能ファイル、またはリリースにアタッチされたプリコンパイル済みバイナリ実行可能ファイルのセットが必要です。\n\n> \\[!NOTE]\n> 実行可能スクリプトに依存する場合は、bash スクリプトを使用することをお勧めします。bash は広く利用できるインタープリターであるためです。 bash 以外のスクリプトを使用できますが、拡張機能を使用するには、ユーザーに必要なインタープリターがインストールされている必要があります。 インタープリターがインストールされているユーザーに依存しない場合は、プリコンパイル済み拡張機能を検討してください。\n\n##\n\n```\n          `gh extension create` で解釈される拡張機能を作成する\n```\n\n> \\[!NOTE]\n> 引数なしで `gh extension create` を実行すると、対話型ウィザードが開始されます。\n\n```\n          `gh extension create` コマンドを使用して、いくつかのスターター コードを含む bash スクリプトを含む拡張機能のprojectを作成できます。\n```\n\n1\\.\n`gh extension create` サブコマンドを使用して、新しい拡張機能を設定します。\n`EXTENSION-NAME` は、お使いの拡張機能の名前に置き換えます。\n\n````\n```shell\ngh extension create EXTENSION-NAME\n```\n````\n\n1. 表示された指示に従って、拡張機能を最終処理し、必要に応じて公開します。\n\n##\n\n```\n          `gh extension create` を使用して Go でプリコンパイル済み拡張機能を作成する\n\n          `--precompiled=go` 引数を使用して、Go スキャフォールディング、ワークフロー スキャフォールディング、スターター コードなど、拡張機能の Go ベースのprojectを作成できます。\n```\n\n1\\.\n`gh extension create` サブコマンドを使用して、新しい拡張機能を設定します。\n`EXTENSION-NAME` は、お使いの拡張機能の名前に置き換えて、`--precompiled=go` を指定します。\n\n````\n```shell\ngh extension create --precompiled=go EXTENSION-NAME\n```\n````\n\n1. 表示された指示に従って、拡張機能を最終処理し、必要に応じて公開します。\n\n##\n\n```\n          `gh extension create` を使用して Go 以外のプリコンパイル済み拡張機能を作成する\n\n          `--precompiled=other` 引数を使用して、Go 以外のプリコンパイル済み拡張機能のproject (ワークフロー スキャフォールディングを含む) を作成できます。\n```\n\n1\\.\n`gh extension create` サブコマンドを使用して、新しい拡張機能を設定します。\n`EXTENSION-NAME` は、お使いの拡張機能の名前に置き換えて、`--precompiled=other` を指定します。\n\n````\n```shell\ngh extension create --precompiled=other EXTENSION-NAME\n```\n````\n\n1. 選択したコンパイル済み言語に拡張機能の初期コードをいくつか追加します。\n\n2. 拡張機能を自動的にビルドできるように、`script/build.sh` に拡張機能をビルドするコードを入力します。\n\n3. 表示された指示に従って、拡張機能を最終処理し、必要に応じて公開します。\n\n## 解釈される拡張機能を手動で作成する\n\n1. ```\n          `gh-EXTENSION-NAME` というローカル ディレクトリを作成し、拡張機能用に使用します。 \n          `EXTENSION-NAME` は、お使いの拡張機能の名前に置き換えます。 たとえば、`gh-whoami` のようにします。\n   ```\n\n2. 作成したディレクトリに、ディレクトリと同じ名前の実行可能ファイルを追加します。\n\n   > \\[!NOTE]\n   > ファイルが実行可能であることを確認します。 UNIX では、コマンド ラインで `chmod +x file_name` を実行して、`file_name` を実行可能にできます。 Windows では、`git init -b main`、`git add file_name`、そして `git update-index --chmod=+x file_name` を実行できます。\n\n3. 実行可能ファイルにスクリプトを記述します。 たとえば次のような点です。\n\n   ```bash\n   #!/usr/bin/env bash\n   set -e\n   exec gh api user --jq '\"You are @\\(.login) (\\(.name)).\"'\n   ```\n\n4. ディレクトリから、拡張機能をローカル拡張機能としてインストールします。\n\n   ```shell\n   gh extension install .\n   ```\n\n5. 拡張機能が機能することを確認します。\n   `EXTENSION-NAME` は、お使いの拡張機能の名前に置き換えます。 たとえば、`whoami` のようにします。\n\n   ```shell\n   gh EXTENSION-NAME\n   ```\n\n6. ディレクトリから、拡張機能を公開するリポジトリを作成します。\n   `EXTENSION-NAME` は、お使いの拡張機能の名前に置き換えます。\n\n   ```shell\n   git init -b main\n   git add . && git commit -m \"initial commit\"\n   gh repo create gh-EXTENSION-NAME --source=. --public --push\n   ```\n\n7. 必要に応じて、他のユーザーが拡張機能を検出できるように、リポジトリ トピック `gh-extension` を追加します。 これにより、拡張機能が [`gh-extension` トピック ページ](https://github.com/topics/gh-extension)に表示されます。 リポジトリ トピックの追加方法の詳細については、「[トピックでリポジトリを分類する](/ja/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/classifying-your-repository-with-topics)」を参照してください。\n\n## 解釈された GitHub CLI 拡張機能を記述するためのヒント\n\n### 引数とフラグの処理\n\n```\n          `gh my-extension-name` コマンドに続くすべてのコマンド ライン引数は、拡張機能スクリプトに渡されます。 bash スクリプトでは、引数を`$1`、`$2` などで参照することができます。引数を使用して、ユーザーによる入力を取得したり、スクリプトの動作を変更したりできます。\n```\n\nたとえば、このスクリプトは複数のフラグを処理します。 スクリプトが `-h` または `--help` フラグで呼び出されると、スクリプトは実行を続行する代わりにヘルプ テキストを出力します。 スクリプトが `--name` フラグで呼び出されると、スクリプトはフラグの次の値を `name_arg` に設定します。 スクリプトが `--verbose` フラグで呼び出されると、スクリプトは別のあいさつ文を出力します。\n\n```bash\n#!/usr/bin/env bash\nset -e\n\nverbose=\"\"\nname_arg=\"\"\nwhile [ $# -gt 0 ]; do\n  case \"$1\" in\n  --verbose)\n    verbose=1\n    ;;\n  --name)\n    name_arg=\"$2\"\n    shift\n    ;;\n  -h|--help)\n    echo \"Add help text here.\"\n    exit 0\n    ;;\n  esac\n  shift\ndone\n\nif [ -z \"$name_arg\" ]\nthen\n  echo \"You haven't told us your name.\"\nelif [ -z \"$verbose\" ]\nthen\n  echo \"Hi $name_arg\"\nelse\n  echo \"Hello and welcome, $name_arg\"\nfi\n```\n\n### 非対話型モードでのコア コマンドの呼び出し\n\n一部の GitHub CLI コア コマンドは、ユーザーに入力を求めます。 これらのコマンドを使用してスクリプトを作成する場合、プロンプトが望ましくないことがよくあります。 プロンプトが表示されないようにするには、引数を使用して必要な情報を明示的に指定します。\n\nたとえば、プログラムで問題を作成するには、タイトルと本文を指定します。\n\n```shell\ngh issue create --title \"My Title\" --body \"Issue description\"\n```\n\n### プログラムによるデータの取得\n\n多くのコア コマンドは、プログラムでデータをフェッチするための `--json` フラグをサポートしています。 たとえば、pull request の数、タイトル、マージ可能性の状態を一覧表示する JSON オブジェクトを返すには、次のようにします。\n\n```shell\ngh pr list --json number,title,mergeStateStatus\n```\n\nGitHubから特定のデータをフェッチするコア コマンドがない場合は、[`gh api`](https://cli.github.com/manual/gh_api) コマンドを使用して、GitHub API をaccessできます。 たとえば、現在のユーザーに関する情報をフェッチするには、次のようにします。\n\n```shell\ngh api user\n```\n\nJSON データを出力するすべてのコマンドには、そのデータをスクリプトですぐに使用できるものにフィルター処理するオプションもあります。 たとえば、現在のユーザーの名前を取得するには、次のようにします。\n\n```shell\ngh api user --jq '.name'\n```\n\n詳細については、「[`gh help formatting`](https://cli.github.com/manual/gh_help_formatting)を参照してください。\n\n## プリコンパイル済み拡張機能を手動で作成する\n\n1. ```\n          `gh-EXTENSION-NAME` というローカル ディレクトリを作成し、拡張機能用に使用します。 \n          `EXTENSION-NAME` は、お使いの拡張機能の名前に置き換えます。 たとえば、`gh-whoami` のようにします。\n   ```\n\n2. 作成したディレクトリにソース コードを追加します。 たとえば次のような点です。\n\n   ```golang\n   package main\n   import (\n     \"github.com/cli/go-gh\"\n     \"fmt\"\n   )\n\n   func main() {\n     args := []string{\"api\", \"user\", \"--jq\", `\"You are @\\(.login) (\\(.name))\"` }\n     stdOut, _, err := gh.Exec(args...)\n     if err != nil {\n       fmt.Println(err)\n       return\n     }\n     fmt.Println(stdOut.String())\n   }\n   ```\n\n3. ディレクトリから、拡張機能をローカル拡張機能としてインストールします。\n\n   ```shell\n   gh extension install .\n   ```\n\n4. コードをビルドします。 たとえば、Go では、`YOUR-USERNAME`をGitHubユーザー名に置き換えます。\n\n   ```shell\n   go mod init github.com/YOUR-USERNAME/gh-whoami\n   go mod tidy\n   go build\n   ```\n\n5. 拡張機能が機能することを確認します。\n   `EXTENSION-NAME` は、お使いの拡張機能の名前に置き換えます。 たとえば、`whoami` のようにします。\n\n   ```shell\n   gh EXTENSION-NAME\n   ```\n\n6. ディレクトリから、拡張機能を公開するリポジトリを作成します。\n   `EXTENSION-NAME` は、お使いの拡張機能の名前に置き換えます。\n\n   > \\[!NOTE]\n   > コンパイル ステップによって生成されたバイナリをバージョン コントロールにコミットしないように注意してください。\n\n   ```shell\n    git init -b main\n   echo \"gh-EXTENSION-NAME\" >> .gitignore\n   git add main.go go.* .gitignore && git commit -m 'Initial commit'\n   gh repo create \"gh-EXTENSION-NAME\"\n   ```\n\n7. プリコンパイル済み拡張機能を他のユーザーと共有するリリースを作成します。 サポートするプラットフォームごとにコンパイルし、各バイナリを資産としてリリースにアタッチします。 リリースにアタッチされるバイナリ実行可能ファイルは、名前付け規則に従い、OS-ARCHITECTURE\\[EXTENSION] のサフィックスを持つ必要があります。\n\n   たとえば、Windows 64 ビット用にコンパイルされた `whoami` という拡張機能の名前は `gh-whoami-windows-amd64.exe` になり、Linux 32 ビット用にコンパイルされた同じ拡張機能の名前は `gh-whoami-linux-386` になります。\n   `gh` によって認識される OS とアーキテクチャの組み合わせの完全な一覧については、[このソース コード](https://github.com/cli/cli/blob/14f704fd0da58cc01413ee4ba16f13f27e33d15e/pkg/cmd/extension/manager.go#L696)を参照してください。\n\n   > \\[!NOTE]\n   > Windows で拡張機能を正常に実行するには、その資産ファイルの拡張子が `.exe` である必要があります。 他のオペレーティング システムでは拡張子は必要ありません。\n\n   リリースはコマンド ラインから作成できます。 たとえば次のような点です。\n\n   ```shell\n   git tag v1.0.0\n   git push origin v1.0.0\n   GOOS=windows GOARCH=amd64 go build -o gh-EXTENSION-NAME-windows-amd64.exe\n   GOOS=linux GOARCH=amd64 go build -o gh-EXTENSION-NAME-linux-amd64\n   GOOS=darwin GOARCH=amd64 go build -o gh-EXTENSION-NAME-darwin-amd64\n   gh release create v1.0.0 ./*amd64*\n\n   ```\n\n8. Optionally, to help other users discover your extension, add the repository topic `gh-extension`. This will make the extension appear on the [`gh-extension` topic page](https://github.com/topics/gh-extension). For more information about how to add a repository topic, see [Classifying your repository with topics](/ja/github/administering-a-repository/managing-repository-settings/classifying-your-repository-with-topics).\n\n## Tips for writing precompiled GitHub CLI extensions\n\n### Automating releases\n\nConsider adding the [gh-extension-precompile](https://github.com/cli/gh-extension-precompile) action to a workflow in your project. This action will automatically produce cross-compiled Go binaries for your extension and supplies build scaffolding for non-Go precompiled extensions.\n\n### Using GitHub CLI features from Go-based extensions\n\nConsider using [go-gh](https://github.com/cli/go-gh), a Go library that exposes pieces of `gh` functionality for use in extensions.\n\n## Next steps\n\nTo see more examples of GitHub CLI extensions, look at [repositories with the `gh-extension` topic](https://github.com/topics/gh-extension)."}