{"meta":{"title":"Erstellen GitHub CLI-Erweiterungen","intro":"Hier erfährst du, wie du neue GitHub CLI-Befehle mit anderen Benutzer*inen teilen kannst, indem du benutzerdefinierte Erweiterungen für GitHub CLI erstellst.","product":"GitHub CLI","breadcrumbs":[{"href":"/de/github-cli","title":"GitHub CLI"},{"href":"/de/github-cli/github-cli","title":"GitHub CLI"},{"href":"/de/github-cli/github-cli/creating-github-cli-extensions","title":"Erstellen GitHub CLI-Erweiterungen"}],"documentType":"article"},"body":"# Erstellen GitHub CLI-Erweiterungen\n\nHier erfährst du, wie du neue GitHub CLI-Befehle mit anderen Benutzer*inen teilen kannst, indem du benutzerdefinierte Erweiterungen für GitHub CLI erstellst.\n\n## Informationen zu GitHub CLI-Erweiterungen\n\nGitHub CLI-Erweiterungen sind benutzerdefinierte GitHub CLI-Befehle, die jeder erstellen und verwenden kann. Weitere Informationen zum Verwenden von GitHub CLI-Erweiterungen finden Sie unter [Verwenden von GitHub CLI-Erweiterungen](/de/github-cli/github-cli/using-github-cli-extensions).\n\nDu benötigst ein Repository für jede Erweiterung, die du erstellst. Der Repositoryname muss mit `gh-` beginnen. Der verbleibende Teil des Repositorynamens ist der Name der Erweiterung. Im Stammverzeichnis des Repositorys muss sich eine ausführbare Datei mit demselben Namen wie das Repository oder ein Satz vorkompilierter ausführbarer Binärdateien befinden, die an ein Release angefügt sind.\n\n> \\[!NOTE]\n> Wenn du ein ausführbares Skript nutzen möchtest, empfehlen wir dir die Verwendung eines Bash-Skripts, da Bash ein weit verbreiteter Interpreter ist. Du kannst auch nicht-Bash-Skripte verwenden, aber der Benutzer muss über den erforderlichen Interpreter verfügen, um die Erweiterung nutzen zu können. Wenn du dich nicht darauf verlassen möchtest, dass die Benutzer den geeigneten Interpreter installiert haben, kannst du eine vorkompilierte Erweiterung in Erwägung ziehen.\n\n## Erstellen einer interpretierten Erweiterung mit `gh extension create`\n\n> \\[!NOTE]\n> Wenn du `gh extension create` ohne Argumente ausführst, wird ein interaktiver Assistent gestartet.\n\nSie können den Befehl `gh extension create` verwenden, um ein Projekt für Ihre Erweiterung zu erstellen, einschließlich eines Bash-Skripts, das einen Starter-Code enthält.\n\n1. Richte mithilfe des Unterbefehls `gh extension create` eine neue Erweiterung ein. Ersetze `EXTENSION-NAME` durch den Namen deiner Erweiterung.\n\n   ```shell\n   gh extension create EXTENSION-NAME\n   ```\n\n2. Folge den angegebenen Anweisungen, um deine Erweiterung fertigzustellen und optional zu veröffentlichen.\n\n## Erstellen einer vorkompilierten Erweiterung in Go mit `gh extension create`\n\nSie können das Argument `--precompiled=go` verwenden, um ein Go-basiertes Projekt für Ihre Erweiterung zu erstellen, einschließlich Go-Scaffolding, Workflow-Scaffolding und Startcode.\n\n1. Richte mithilfe des Unterbefehls `gh extension create` eine neue Erweiterung ein. Ersetze `EXTENSION-NAME` durch den Namen deiner Erweiterung, und gib `--precompiled=go` an.\n\n   ```shell\n   gh extension create --precompiled=go EXTENSION-NAME\n   ```\n\n2. Folge den angegebenen Anweisungen, um deine Erweiterung fertigzustellen und optional zu veröffentlichen.\n\n## Erstellen einer vorkompilierten Erweiterung ohne Go mit `gh extension create`\n\nSie können das Argument \"`--precompiled=other`\" verwenden, um ein Projekt für Ihre nicht-Go-vorkompilierte Erweiterung zu erstellen, einschließlich des Workflowgerüsts.\n\n1. Richte mithilfe des Unterbefehls `gh extension create` eine neue Erweiterung ein. Ersetze `EXTENSION-NAME` durch den Namen deiner Erweiterung, und gib `--precompiled=other` an.\n\n   ```shell\n   gh extension create --precompiled=other EXTENSION-NAME\n   ```\n\n2. Füge den ersten Code für deine Erweiterung in der kompilierten Sprache deiner Wahl hinzu.\n\n3. Füge in `script/build.sh` den Code zum Kompilieren deiner Erweiterung ein, um sicherzustellen, dass deine Erweiterung automatisch erstellt werden kann.\n\n4. Folge den angegebenen Anweisungen, um deine Erweiterung fertigzustellen und optional zu veröffentlichen.\n\n## Manuelles Erstellen einer interpretierten Erweiterung\n\n1. Erstelle ein lokales Verzeichnis namens `gh-EXTENSION-NAME` für deine Erweiterung. Ersetze `EXTENSION-NAME` durch den Namen deiner Erweiterung. Beispiel: `gh-whoami`.\n\n2. Füge in das erstellte Verzeichnis eine ausführbare Datei mit demselben Namen wie das Verzeichnis ein.\n\n   > \\[!NOTE]\n   > Stelle sicher, dass es sich um eine ausführbare Datei handelt. Unter Unix kannst du `chmod +x file_name` in der Befehlszeile ausführen, um `file_name` ausführbar zu machen. Unter Windows kannst du `git init -b main`, `git add file_name` und dann `git update-index --chmod=+x file_name` ausführen.\n\n3. Schreibe dein Skript in die ausführbare Datei. Beispiel:\n\n   ```bash\n   #!/usr/bin/env bash\n   set -e\n   exec gh api user --jq '\"You are @\\(.login) (\\(.name)).\"'\n   ```\n\n4. Installiere die Erweiterung aus deinem Verzeichnis als lokale Erweiterung.\n\n   ```shell\n   gh extension install .\n   ```\n\n5. Vergewissere dich, dass deine Erweiterung funktioniert. Ersetze `EXTENSION-NAME` durch den Namen deiner Erweiterung. Beispiel: `whoami`.\n\n   ```shell\n   gh EXTENSION-NAME\n   ```\n\n6. Erstelle aus deinem Verzeichnis ein Repository, um deine Erweiterung zu veröffentlichen. Ersetze `EXTENSION-NAME` durch den Namen deiner Erweiterung.\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. Optionalerweise kannst du das Thema des Repositories `gh-extension` hinzufügen, damit andere Benutzer deine Erweiterung leichter finden. Dadurch wird die Erweiterung auf der [`gh-extension` Themenseite](https://github.com/topics/gh-extension) angezeigt. Weitere Informationen zum Hinzufügen eines Repositoryartikels findest du unter [Dein Repository mit Themen klassifizieren](/de/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/classifying-your-repository-with-topics).\n\n## Tipps für das Schreiben von interpretierten GitHub CLI-Erweiterungen\n\n### Verarbeiten von Argumenten und Flags\n\nAlle Befehlszeilenargumente, die auf einen `gh my-extension-name`-Befehl folgen, werden an das Erweiterungsskript übergeben. In einem Bash-Skript kannst du Argumente mit `$1`, `$2`, usw. referenzieren. Du kannst Argumente verwenden, um Benutzereingaben zu akzeptieren oder um das Verhalten des Skripts zu ändern.\n\nIn diesem Skript werden beispielsweise mehrere Flags verarbeitet. Wenn das Skript mit dem Flag `-h` oder `--help` aufgerufen wird, gibt das Skript einen Hilfetext aus, anstatt die Ausführung fortzusetzen. Beim Aufruf des Skripts mit dem Flag `--name` legt das Skript den nächsten Wert nach dem Flag auf `name_arg` fest. Wird das Skript mit dem Flag `--verbose` aufgerufen, gibt es eine andere Begrüßung aus.\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### Aufrufen von Kernbefehlen im nicht interaktiven Modus\n\nDurch einige GitHub CLI-Kernbefehle wird der Benutzer zu einer Eingabe aufgefordert. Beim Schreiben von Skripts mit diesen Befehlen ist eine Eingabeaufforderung oft unerwünscht. Um Eingabeaufforderungen zu vermeiden, gibst du die notwendigen Informationen explizit über Argumente an.\n\nZum Beispiel kannst du zum programmgesteuerten Erstellen eines Issues dessen Titel und Text angeben:\n\n```shell\ngh issue create --title \"My Title\" --body \"Issue description\"\n```\n\n### Programmgesteuertes Abrufen von Daten\n\nViele Kernbefehle unterstützen das Flag `--json` zum programmgesteuerten Abrufen von Daten. So kannst du zum Beispiel ein JSON-Objekt zurückgeben, das die Anzahl, den Titel und den Mergestatus von Pull Requests auflistet:\n\n```shell\ngh pr list --json number,title,mergeStateStatus\n```\n\nWenn es keinen Kernbefehl zum Abrufen bestimmter Daten aus GitHub gibt, können Sie den Befehl [`gh api`](https://cli.github.com/manual/gh_api) verwenden, um die GitHub-API zu access. So kannst du zum Beispiel Informationen über den aktuellen Benutzer abrufen:\n\n```shell\ngh api user\n```\n\nAlle Befehle, die JSON-Daten ausgeben, bieten Optionen zum Filtern dieser Daten, sodass sie von einem Skript besser genutzt werden können. Zum Beispiel, um den Namen des aktuellen Benutzers abzurufen:\n\n```shell\ngh api user --jq '.name'\n```\n\nWeitere Informationen finden Sie unter [`gh help formatting`](https://cli.github.com/manual/gh_help_formatting).\n\n## Manuelles Erstellen einer vorkompilierten Erweiterung\n\n1. Erstelle ein lokales Verzeichnis namens `gh-EXTENSION-NAME` für deine Erweiterung. Ersetze `EXTENSION-NAME` durch den Namen deiner Erweiterung. Beispiel: `gh-whoami`.\n\n2. Füge in das von dir erstellte Verzeichnis etwas Quellcode ein. Beispiel:\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. Installiere die Erweiterung aus deinem Verzeichnis als lokale Erweiterung.\n\n   ```shell\n   gh extension install .\n   ```\n\n4. Kompiliere deinen Code. Ersetzen Sie beispielsweise mit \"Go\" `YOUR-USERNAME` durch Ihren GitHub Benutzernamen:\n\n   ```shell\n   go mod init github.com/YOUR-USERNAME/gh-whoami\n   go mod tidy\n   go build\n   ```\n\n5. Vergewissere dich, dass deine Erweiterung funktioniert. Ersetze `EXTENSION-NAME` durch den Namen deiner Erweiterung. Beispiel: `whoami`.\n\n   ```shell\n   gh EXTENSION-NAME\n   ```\n\n6. Erstelle aus deinem Verzeichnis ein Repository, um deine Erweiterung zu veröffentlichen. Ersetze `EXTENSION-NAME` durch den Namen deiner Erweiterung.\n\n   > \\[!NOTE]\n   > Achte darauf, die im Kompilierungsschritt erzeugte Binärdatei nicht in die Versionsverwaltung aufzunehmen.\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. Erstelle ein Release, um deine vorkompilierte Erweiterung mit anderen zu teilen. Kompiliere die Erweiterung für jede Plattform, die du unterstützen möchtest, und füge jede Binärdatei als Ressource an ein Release an. Die ausführbaren Binärdateien, die den Releases angefügt sind, müssen einer Namenskonvention folgen und das Suffix BETRIEBSSYSTEMARCHITEKTUR\\[ERWEITERUNG] aufweisen.\n\n   Eine Erweiterung mit dem Namen `whoami`, die für die 64-Bit-Version von Windows kompiliert wird, erhält zum Beispiel den Namen `gh-whoami-windows-amd64.exe`, während die gleiche Erweiterung beim Kompilieren für die 32-Bit-Version von Linux den Namen `gh-whoami-linux-386` erhält. Eine vollständige Liste der von `gh` erkannten Betriebssystem- und Architekturkombinationen finden Sie unter [dieser Quellcode](https://github.com/cli/cli/blob/14f704fd0da58cc01413ee4ba16f13f27e33d15e/pkg/cmd/extension/manager.go#L696).\n\n   > \\[!NOTE]\n   > Damit deine Erweiterung unter Windows richtig funktioniert, muss die Ressourcendatei die Erweiterung `.exe` aufweisen. Für andere Betriebssysteme ist keine Erweiterung erforderlich.\n\n   Releases können über die Befehlszeile erstellt werden. Beispiel:\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](/de/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)."}