Últimamente me he vuelto un gran fanático de las aplicaciones CLI. Tal vez sea el atractivo del terminal de mi infancia (comenzando con DOS en un 486/33 y el viejo Apple IIe de mi padre). Nací un poco tarde para la era Gen X Commodore64, pero justo a tiempo para saber más que solo Windows 95. Era una era interesante, cuando el acceso telefónico y los módems de 56k eran los reyes. Sé que la mayoría de las publicaciones de blogs en estos días tienen una introducción introductoria, para completar el recuento de palabras para SEO, pero esta es realmente la razón por la que todavía amo la CLI cuando muchos de los jóvenes en estos días solo conocen las aplicaciones GUI. Nada me hace más feliz que ver a los niños de la Generación Z encender la terminal, incluso para tareas simples. Hombre, espera hasta que Gen Alpha descubra qué es un BBS. “Las computadoras del abuelo” probablemente dirán?. “SALGA DE MI CÉSPED” ✊✊
Proyectos como CoolRetroTerm definitivamente tienen un lugar cálido en mi corazón, por recuperar el amor por CLI. Todavía prefiero escribir algunos de mis blogs en Micro en mi viejo Netbook, de verdad, concentrémonos en escribir. Supongo que VSCode ZenMode y MarkText se acercan.
flowchart LR Build_App --> GH_Actions --> ??? --> Profit!!!
De todos modos, estoy divagando…
Entonces, después de escribir mi pequeña aplicación CLI Stampy, me encontré con un pequeño problema: ¿cómo distribuirla? Al menos fui lo suficientemente inteligente como para pensar y escribirlo en GoLang (por mucho que quisiera simplemente compilarlo en Python) para evitar la temida ira de Python Packaging. Una cosa que siempre me ha dejado perplejo fue cómo la gente publica sus bonitas aplicaciones CLI en sofisticados sistemas de gestión de paquetes como APT y YUM.
Normalmente, para crear tu aplicación, simplemente harías una simple compilación. y boom, binario instantáneo. Por muy bueno que sea para el desarrollador local, no sirve de mucho para las compilaciones multiplataforma. Hay algunas guías interesantes que le muestran cómo hacerlo, pero... tl;dr para mi ??. Así que investigué un poco más, tenía que haber una buena herramienta... y claro, ¡existe GoReleaser!
Después de leer documentación muy bien escrita, pude realizar una compilación multiplataforma local rápida y sencilla.
goreleaser --snapshot --clean
¡Conseguir que se realicen compilaciones con las versiones de GitHub también fue fácil, ya que tienen bonitas acciones de GH preescritas!
¡Los usuarios ahora pueden simplemente instalar mi aplicación con herramientas como eget (bueno) y estofado (mucho mejor)!
Si bien también puedes instalar github.com/xxx, todo lo que esto haría es clonar el repositorio, compilarlo localmente y colocar el contenedor en tu carpeta $GOBIN. En realidad, no es lo mismo que una herramienta de administración de paquetes adecuada, pero funciona en caso de necesidad para las personas que ya tienen Go instalado . Realmente no es una opción para el usuario promedio en mi humilde opinión. ?
Y no solo eso, ¡GoReleaser también ofrece empaques! Ahora puedes crear DEB y RPM fácilmente. Estaba un paso más cerca del asustado apt-get install stampy. Lo único que faltaba era cómo crear un repositorio APT. Esta última parte clave no es fácil con seguridad. Pasé aproximadamente una hora investigando cómo alojar esto yo mismo con GitHub Pages y, si bien es factible, fue mucho más fácil usar un servicio gratuito como Packagecloud para manejar la firma y el alojamiento del repositorio por el bajo costo de $0 por ¿mes?.
Puedes ver un ejemplo de todo el flujo de trabajo AQUÍ
También incluiré una versión simplificada aquí en un bloque de código, para cualquiera que encuentre la publicación del blog.
Para obtener una descripción general de alto nivel, la GHA hace lo siguiente:
name: Release on: pull_request: push: # run only against tags tags: - "*" permissions: contents: write packages: write issues: write jobs: goreleaser: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Set up Go uses: actions/setup-go@v5 with: go-version: stable - name: Release config run: | cat /tmp/goreleaser-github.yaml project_name: EXAMPLE version: 2 builds: - env: [CGO_ENABLED=0] goos: - linux goarch: - amd64 nfpms: - maintainer: YOUbindir: /usr/local/bin description: Copy formatted timestamp to system clipboard homepage: https://github.com/USERNAME/REPO license: MIT formats: - deb release: draft: false # If set to true, will not auto-publish the release. replace_existing_draft: true replace_existing_artifacts: true target_commitish: "{{ .Commit }}" prerelease: auto make_latest: true mode: replace include_meta: true EOF - name: Run GoReleaser uses: goreleaser/goreleaser-action@v6 with: distribution: goreleaser # 'latest', 'nightly', or a semver version: "~> v2" args: release --clean --verbose --config /tmp/goreleaser-github.yaml env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Upload .deb artifact x86 uses: actions/upload-artifact@v3 with: name: deb-package path: dist/*amd64.deb pkgcld_amd64-deb: runs-on: ubuntu-latest needs: - goreleaser strategy: max-parallel: 3 matrix: distro: - debian/bookworm - ubuntu/noble - ubuntu/jammy steps: - name: Download .deb artifact uses: actions/download-artifact@v3 with: name: deb-package - name: Push package to packagecloud.io uses: computology/[email protected] with: package-name: ./*.deb packagecloud-username: USERNAME packagecloud-reponame: APP_NAME packagecloud-distro: ${{ matrix.distro }} packagecloud-token: ${{ secrets.PACKAGECLOUD_TOKEN }}
ℹ️ Importante
Querrás asegurarte de que aspectos como la estructura del programa y tu archivo go.mod estén configurados correctamente, o tendrás problemas para publicar tu aplicación correctamente.
Nota al margen: también puedes distribuir tu aplicación con Homebrew, pero no me molesté debido a la complejidad adicional de las acciones de GH que involucran secretos PAT y al hecho de que estoy bastante bien cubierto con Apt, Mmm, y Estofado… ¡sabroso! ?
Esto me lleva a la segunda cosa importante al lanzar una aplicación. ?DOCUMENTACIÓN? y el muy olvidado Readme.md?!
Hay algunos elementos que creo que cualquier archivo Léame decente debería tener, ya que ayudarán a que tu aplicación se destaque de todas las aplicaciones con poca o ninguna documentación, o peor aún, con mala documentación.
¡Te recomiendo encarecidamente que sigas este formato para crear tu propio archivo Léame! Soy un gran admirador de las insignias con estilo, pero siento que tener una pequeña demostración de GIF realmente muestra a la gente de qué se trata, al igual que enumerar capturas de pantalla de sus aplicaciones GUI. Usar ASCIINEMA fue bastante fácil y también tienen un buen conversor de GIF para que todo luzca perfecto.
? Consejo
Como nota al margen, pedí que CodeGPT me escribiera algunas pruebas unitarias de GoLang, que sé que normalmente son difíciles de escribir. Es un complemento fantástico si estás en la suite JetBrains.
Al igual que cuando me propuse aprender a publicar aplicaciones Python, me alegra poder decir que siento que puedo distribuir adecuadamente cualquier aplicación que escriba en GoLang en el futuro. Es una gran habilidad que adquirí y, con esta publicación de blog, espero que pueda ayudar a otros a hacer lo mismo. ¡Salud!
-Come gelatina
? Mastodonte | ? Correo electrónico | ? Comentarios | ☕ Invítame un café
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3