{"meta":{"title":"Creación de extensiones de la CLI de GitHub","intro":"Aprende cómo compartir comandos nuevos de GitHub CLI con otros usurios creando extensiones personalizadas para GitHub CLI.","product":"GitHub CLI","breadcrumbs":[{"href":"/es/github-cli","title":"GitHub CLI"},{"href":"/es/github-cli/github-cli","title":"CLI de GitHub"},{"href":"/es/github-cli/github-cli/creating-github-cli-extensions","title":"Creación de extensiones de la CLI de GitHub"}],"documentType":"article"},"body":"# Creación de extensiones de la CLI de GitHub\n\nAprende cómo compartir comandos nuevos de GitHub CLI con otros usurios creando extensiones personalizadas para GitHub CLI.\n\n## Acerca de las extensiones del GitHub CLI\n\nLas extensiones del GitHub CLI son comandos personalizados del GitHub CLI que cualquiera puede crear y utilizar. Para obtener más información sobre cómo usar las extensiones de GitHub CLI, consulte [Uso de extensiones de la CLI de GitHub](/es/github-cli/github-cli/using-github-cli-extensions).\n\nNecesitas un repositorio para cada extensión que crees. El nombre del repositorio debe empezar con `gh-`. El nombre restante del repositorio coincide con el nombre de la extensión. El repositorio debe tener un archivo ejecutable en su raíz con el mismo nombre del repositorio o un conjunto de archivos binarios ejecutables precompilados adjuntos a un lanzamiento.\n\n> \\[!NOTE]\n> Cuando se dependa de un script ejecutable, es recomendable usar un script de bash, ya que bash es un intérprete ampliamente disponible. Puedes utilizar scripts diferentes a los de bash, pero el usuario debe tener el interprete necesario instalado para poder utilizar la extensión. Si prefieres no confiar en usuarios que tengan intérpretes instalados, considera utilizar una extensión precompilada.\n\n## Creación de una extensión interpretada con `gh extension create`\n\n> \\[!NOTE]\n> Al ejecutar `gh extension create` sin argumentos, se iniciará un asistente interactivo.\n\nPuede usar el comando `gh extension create` para crear un project para la extensión, incluido un script de Bash que contenga algún código de inicio.\n\n1. Configure una nueva extensión mediante el subcomando `gh extension create`. Reemplace `EXTENSION-NAME` por el nombre de la extensión.\n\n   ```shell\n   gh extension create EXTENSION-NAME\n   ```\n\n2. Sigue las instrucciones impresas para finalizar y, opcionalmente, publicar tu extensíón.\n\n## Creación de una extensión precompilada en Go con `gh extension create`\n\nPuede usar el argumento `--precompiled=go` para crear un proyecto basado en Go para su extensión, incluyendo el andamiaje de Go, la estructuración del flujo de trabajo y el código de inicio.\n\n1. Configure una nueva extensión mediante el subcomando `gh extension create`. Reemplace `EXTENSION-NAME` por el nombre de la extensión y especifique `--precompiled=go`.\n\n   ```shell\n   gh extension create --precompiled=go EXTENSION-NAME\n   ```\n\n2. Sigue las instrucciones impresas para finalizar y, opcionalmente, publicar tu extensíón.\n\n## Creación de una extensión precompilada que no sea de Go con `gh extension create`\n\nPuede usar el argumento `--precompiled=other` para crear un proyecto para su extensión precompilada que no sea de Go, incluida la estructura del flujo de trabajo.\n\n1. Configure una nueva extensión mediante el subcomando `gh extension create`. Reemplace `EXTENSION-NAME` por el nombre de la extensión y especifique `--precompiled=other`.\n\n   ```shell\n   gh extension create --precompiled=other EXTENSION-NAME\n   ```\n\n2. Agrega algo de código inicial para tu extensión en el lenguaje de compilación que elijas.\n\n3. Rellene `script/build.sh` con código para crear la extensión y asegúrese de que se pueda compilar de forma automática.\n\n4. Sigue las instrucciones impresas para finalizar y, opcionalmente, publicar tu extensíón.\n\n## Crear una extensión interpretada manualmente\n\n1. Cree un directorio local llamado `gh-EXTENSION-NAME` para la extensión. Reemplace `EXTENSION-NAME` por el nombre de la extensión. Por ejemplo: `gh-whoami`.\n\n2. En el directorio que creaste, agrega un archivo ejecutable con el mismo nombre que el directorio.\n\n   > \\[!NOTE]\n   > Asegúrate de que el archivo sea ejecutable. En Unix, puede ejecutar `chmod +x file_name` en la línea de comandos para convertir `file_name` en ejecutable. En Windows, puede ejecutar `git init -b main`, `git add file_name` y después `git update-index --chmod=+x file_name`.\n\n3. Escribe tu script en el archivo ejecutable. Por ejemplo:\n\n   ```bash\n   #!/usr/bin/env bash\n   set -e\n   exec gh api user --jq '\"You are @\\(.login) (\\(.name)).\"'\n   ```\n\n4. Desde tu directorio, instala la extensión como extensión local.\n\n   ```shell\n   gh extension install .\n   ```\n\n5. Verifica que tu extensión funcione. Reemplace `EXTENSION-NAME` por el nombre de la extensión. Por ejemplo: `whoami`.\n\n   ```shell\n   gh EXTENSION-NAME\n   ```\n\n6. Desde tu directorio, crea un repositorio para publicar tu extensión. Reemplace `EXTENSION-NAME` por el nombre de la extensión.\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. Opcionalmente, para ayudar a que otros usuarios descubran la extensión, agregue el tema de repositorio `gh-extension`. Esto hará que la extensión aparezca en la página del tema [`gh-extension`](https://github.com/topics/gh-extension). Para más información sobre cómo agregar un tema de repositorio, consulta [Clasificar tu repositorio con temas](/es/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/classifying-your-repository-with-topics).\n\n## Consejos para escribir extensiones interpretadas de GitHub CLI\n\n### Manejar argumentos y banderas\n\nTodos los argumentos de línea de comandos que aparecen después de un comando `gh my-extension-name` se pasarán al script de la extensión. En un script de bash, puede hacer referencia a argumentos con `$1`, `$2`, etc. Puede usar argumentos para tomar la entrada de usuario o modificar el comportamiento del script.\n\nPor ejemplo, este script maneja marcadores múltiples. Cuando se llama al script con la marca `-h` o `--help`, imprime el texto de ayuda en vez de continuar con la ejecución. Cuando se llama al script con la marca `--name`, el script establece el siguiente valor después de la marca en `name_arg`. Cuando se llama al script con la marca `--verbose`, imprime otro saludo.\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### Llamar a los comandos principales de forma no interactiva\n\nAlgunos comandos principales de GitHub CLI solicitarán al usuario que proporcione datos. Cuando se hagan scripts con estos comandos, un mensaje a menudo se considera indeseable. Para evitar solicitudes, proporciona explícitamente la información necesaria mediante argumentos.\n\nPor ejemplo, para crear una propuesta con programación, especifica el título y cuerpo:\n\n```shell\ngh issue create --title \"My Title\" --body \"Issue description\"\n```\n\n### Recuperar datos mediante programación\n\nMuchos comandos básicos admiten la marca `--json` para recuperar datos mediante programación. Por ejemplo, para devolver un objeto JSON listando el número, título y estado de fusionabilidad de los pull requests:\n\n```shell\ngh pr list --json number,title,mergeStateStatus\n```\n\nSi no hay un comando principal para obtener datos específicos de GitHub, puede usar el comando [`gh api`](https://cli.github.com/manual/gh_api) para acceder a la API de GitHub. Por ejemplo, para recuperar información sobre el usuario actual:\n\n```shell\ngh api user\n```\n\nTodos los comandos que emiten datos de JSON también tiene opciones para filtrar estos datos hacia algo más inmediatamente útil mediante scripts. Por ejemplo, para obtener el nombre del usuario actual:\n\n```shell\ngh api user --jq '.name'\n```\n\nPara obtener más información, vea [`gh help formatting`](https://cli.github.com/manual/gh_help_formatting).\n\n## Crear una extensión precompilada manualmente\n\n1. Cree un directorio local llamado `gh-EXTENSION-NAME` para la extensión. Reemplace `EXTENSION-NAME` por el nombre de la extensión. Por ejemplo: `gh-whoami`.\n\n2. En el directorio que creaste, agrega algo de código fuente. Por ejemplo:\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. Desde tu directorio, instala la extensión como extensión local.\n\n   ```shell\n   gh extension install .\n   ```\n\n4. Compila tu código. Por ejemplo, con Go, reemplazando `YOUR-USERNAME` por el nombre de usuario de GitHub:\n\n   ```shell\n   go mod init github.com/YOUR-USERNAME/gh-whoami\n   go mod tidy\n   go build\n   ```\n\n5. Verifica que tu extensión funcione. Reemplace `EXTENSION-NAME` por el nombre de la extensión. Por ejemplo: `whoami`.\n\n   ```shell\n   gh EXTENSION-NAME\n   ```\n\n6. Desde tu directorio, crea un repositorio para publicar tu extensión. Reemplace `EXTENSION-NAME` por el nombre de la extensión.\n\n   > \\[!NOTE]\n   > Evite confirmar el binario generado por el paso de compilación para el control de versiones.\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. Crea un lanzamiento para compartir tu extensión precompilada con otros. Compila para cada plataforma con la que quieras ser compatible, adjuntando cada binario a un lanzamiento como un activo. Los ejecutables binarios adjuntos a las versiones deben seguir una convención de nomenclatura y tener un sufijo de SO-ARQUITECTURA\\[EXTENSIÓN].\n\n   Por ejemplo, una extensión denominada `whoami` compilada para Windows de 64 bits tendría el nombre`gh-whoami-windows-amd64.exe`, mientras que la misma extensión compilada para Linux de 32 bits tendría el nombre `gh-whoami-linux-386`. Para ver una lista exhaustiva de combinaciones de sistema operativo y arquitectura reconocidas por `gh`, consulte [este código fuente](https://github.com/cli/cli/blob/14f704fd0da58cc01413ee4ba16f13f27e33d15e/pkg/cmd/extension/manager.go#L696).\n\n   > \\[!NOTE]\n   > Para que la extensión se ejecute correctamente en Windows, su archivo de recurso debe tener una extensión `.exe`. No se necesita ninguna extensión para otros sistemas operativos.\n\n   Los lanzamientos pueden crearse desde la línea de comandos. Por ejemplo:\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](/es/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)."}