{"meta":{"title":"GitHub CLI 확장 만들기","intro":"GitHub CLI에 대한 사용자 지정 확장을 만들어 새 GitHub CLI 명령을 다른 사용자와 공유하는 방법을 알아봅니다.","product":"GitHub CLI","breadcrumbs":[{"href":"/ko/github-cli","title":"GitHub CLI"},{"href":"/ko/github-cli/github-cli","title":"GitHub CLI"},{"href":"/ko/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 확장 사용](/ko/github-cli/github-cli/using-github-cli-extensions)를 참조하세요.\n\n만드는 각 확장에 대한 리포지토리가 필요합니다. 리포지토리 이름은 `gh-`로 시작해야 합니다. 리포지토리 이름의 나머지는 확장의 이름입니다. 리포지토리의 루트에는 리포지토리와 이름이 같은 실행 파일이 있거나 릴리스에 첨부된 미리 컴파일된 이진 실행 파일이 있어야 합니다.\n\n> \\[!NOTE]\n> 실행할 수 있는 스크립트에 의존할 경우, 널리 사용 가능한 인터프리터인 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 스캐폴딩, 워크플로 스캐폴딩 및 시작 코드가 포함됩니다.\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가 아닌 미리 컴파일된 확장을 위한 프로젝트를 만들 수 있습니다.\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. 확장에 대해 `gh-EXTENSION-NAME`이라는 로컬 디렉터리를 만듭니다.\n   `EXTENSION-NAME`를 확장의 이름으로 바꿉니다. 예들 들어 `gh-whoami`입니다.\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) 표시됩니다. 리포지토리 항목을 추가하는 방법에 대한 자세한 내용은 [토픽을 사용하여 리포지토리 분류](/ko/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예를 들어 이 스크립트는 여러 플래그를 처리합니다.\n`-h` 또는 `--help` 플래그와 함께 호출될 경우 스크립트는 실행을 계속하는 대신 도움말 텍스트를 출력합니다.\n`--name` 플래그와 함께 호출될 경우 스크립트는 플래그 뒤의 다음 값을 `name_arg`로 설정합니다.\n`--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` 플래그를 지원합니다. 예를 들어 끌어오기 요청의 수, 제목, 병합 가능성 상태를 나열하는 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. 확장에 대해 `gh-EXTENSION-NAME`이라는 로컬 디렉터리를 만듭니다.\n   `EXTENSION-NAME`를 확장의 이름으로 바꿉니다. 예들 들어 `gh-whoami`입니다.\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](/ko/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)."}