{"meta":{"title":"Создание расширений GitHub CLI","intro":"Узнайте, как предоставлять общий доступ к новым GitHub CLI командам другим пользователям, создавая пользовательские расширения для GitHub CLI.","product":"GitHub CLI","breadcrumbs":[{"href":"/ru/enterprise-cloud@latest/github-cli","title":"GitHub CLI"},{"href":"/ru/enterprise-cloud@latest/github-cli/github-cli","title":"Интерфейс командной строки GitHub"},{"href":"/ru/enterprise-cloud@latest/github-cli/github-cli/creating-github-cli-extensions","title":"Создание расширений GitHub CLI"}],"documentType":"article"},"body":"# Создание расширений GitHub CLI\n\nУзнайте, как предоставлять общий доступ к новым GitHub CLI командам другим пользователям, создавая пользовательские расширения для GitHub CLI.\n\n## Сведения о GitHub CLI расширениях\n\nРасширения GitHub CLI — это пользовательские команды GitHub CLI, которые может создавать и применять любой пользователь. Дополнительные сведения об использовании GitHub CLI расширений см. в разделе [Использование расширений GitHub CLI](/ru/enterprise-cloud@latest/github-cli/github-cli/using-github-cli-extensions).\n\nВам потребуется репозиторий для каждого создаваемого расширения. Имя репозитория должно начинаться с `gh-`. Остальная часть имени репозитория — это имя расширения. В корне репозитория должен быть исполняемый файл с тем же именем, что и у репозитория, либо к выпуску должен быть прикреплен набор предварительно скомпилированных двоичных исполняемых файлов.\n\n> \\[!NOTE]\n> При использовании исполняемого скрипта рекомендуется использовать скрипт bash, так как bash является широко доступным интерпретатором. Вы можете использовать скрипты, отличные от bash, но для использования расширения у пользователя должен быть установлен необходимый интерпретатор. Чтобы не зависеть от наличия интерпретатора у пользователя, можно предварительно скомпилировать расширение.\n\n## Создание интерпретируемого расширения с помощью `gh extension create`\n\n> \\[!NOTE]\n> Выполнение `gh extension create` без аргументов запустит интерактивный мастер.\n\nВы можете использовать команду `gh extension create` для создания project для расширения, включая bash-скрипт с некоторым стартовым кодом.\n\n1. Настройте новое расширение с помощью подкоманды `gh extension create`. Замените `EXTENSION-NAME` именем своего расширения.\n\n   ```shell\n   gh extension create EXTENSION-NAME\n   ```\n\n2. Следуйте выводимым инструкциям, чтобы завершить и при необходимости опубликовать расширение.\n\n## Создание предварительно скомпилированного расширения на Go с помощью `gh extension create`\n\nВы можете использовать аргумент `--precompiled=go`, чтобы создать project на базе Go, включая строительные леса, рабочие процессы и стартовый код.\n\n1. Настройте новое расширение с помощью подкоманды `gh extension create`. Замените `EXTENSION-NAME` именем своего расширения и укажите `--precompiled=go`.\n\n   ```shell\n   gh extension create --precompiled=go EXTENSION-NAME\n   ```\n\n2. Следуйте выводимым инструкциям, чтобы завершить и при необходимости опубликовать расширение.\n\n## Создание предварительно скомпилированного расширения не на Go с помощью `gh extension create`\n\nВы можете использовать аргумент `--precompiled=other`, чтобы создать project для вашего не-Go предварительно скомпилированного расширения, включая подкрепление рабочих процессов.\n\n1. Настройте новое расширение с помощью подкоманды `gh extension create`. Замените `EXTENSION-NAME` именем своего расширения и укажите `--precompiled=other`.\n\n   ```shell\n   gh extension create --precompiled=other EXTENSION-NAME\n   ```\n\n2. Добавьте исходный код расширения на предпочтительном компилируемом языке.\n\n3. Заполните файл `script/build.sh` кодом так, чтобы сборка расширения могла быть выполнена автоматически.\n\n4. Следуйте выводимым инструкциям, чтобы завершить и при необходимости опубликовать расширение.\n\n## Создание интерпретируемого расширения вручную\n\n1. Создайте для расширения локальный каталог `gh-EXTENSION-NAME`. Замените `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. Убедитесь в том, что расширение работает. Замените `EXTENSION-NAME` именем своего расширения. Например, `whoami`.\n\n   ```shell\n   gh EXTENSION-NAME\n   ```\n\n6. Создайте репозиторий из каталога для публикации расширения. Замените `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). Дополнительные сведения о добавлении раздела репозитория см. в разделе [Классификация репозитория с помощью тем](/ru/enterprise-cloud@latest/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/classifying-your-repository-with-topics).\n\n## Советы по написанию интерпретированных GitHub CLI расширений\n\n### Работа с аргументами и флагами\n\nВсе аргументы командной строки после команды `gh my-extension-name` будут передаваться в скрипт расширения. В скрипте bash можно ссылаться на аргументы с помощью `$1`, `$2` и т. д. С помощью аргументов можно принимать вводимые пользователем данные или изменять выполнение скрипта.\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` флаг для программного получения данных. Например, чтобы вернуть объект JSON со списком номеров, заголовков и состояний возможности слияния запросов на вытягивание, выполните следующую команду:\n\n```shell\ngh pr list --json number,title,mergeStateStatus\n```\n\nЕсли нет основной команды для извлечения конкретных данных из GitHub, вы можете использовать команду [`gh api`](https://cli.github.com/manual/gh_api) для access GitHub API. Например, чтобы получить сведения о текущем пользователе, выполните следующую команду:\n\n```shell\ngh api user\n```\n\nВсе команды, которые выводят данные JSON, также имеют параметры для фильтрации данных с целью их немедленного использования скриптами. Например, чтобы получить имя текущего пользователя, выполните следующую команду:\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`. Замените `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. Убедитесь в том, что расширение работает. Замените `EXTENSION-NAME` именем своего расширения. Например, `whoami`.\n\n   ```shell\n   gh EXTENSION-NAME\n   ```\n\n6. Создайте репозиторий из каталога для публикации расширения. Замените `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].\n\n   Например, расширение с именем `whoami`, скомпилированное для 64-разрядной версии Windows, будет иметь имя `gh-whoami-windows-amd64.exe`, а то же расширение, скомпилированное для 32-разрядной версии Linux, будет иметь имя `gh-whoami-linux-386`. Чтобы увидеть исчерпывающий список комбинаций ОС и архитектур, распознанных `gh`, см. [этот исходный код](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 [Классификация репозитория с помощью тем](/ru/enterprise-cloud@latest/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/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)."}