Ultimamente, tornei-me um grande fã de aplicativos CLI. Talvez seja o fascínio do terminal da minha infância (começando com o DOS em um 486/33 e o antigo Apple IIe do meu pai). Nasci um pouco tarde para a era Gen X Commodore64, mas bem a tempo de saber mais do que apenas o Windows 95. Foi uma época interessante, quando os modems dial-up e de 56k eram reis. Eu sei que a maioria das postagens de blog hoje em dia tem introduções, para aumentar a contagem de palavras para SEO, mas é por isso que ainda amo a CLI quando tantos jovens hoje em dia só conhecem aplicativos GUI. Nada me deixa mais feliz do que ver as crianças da Geração Z ligando o terminal, mesmo para tarefas simples. Cara, espere até a Geração Alfa descobrir o que é um BBS. “Computadores do vovô”, provavelmente dirão? “SAIA DO MEU GRAMADO” ✊✊
Projetos como CoolRetroTerm definitivamente têm um lugar caloroso em meu coração, por trazer de volta o amor CLI. Eu ainda prefiro fazer alguns dos meus blogs no Micro no meu antigo Netbook, vamos realmente se concentrar apenas em escrever. VSCode ZenMode e MarkText chegam perto, eu acho?
flowchart LR Build_App --> GH_Actions --> ??? --> Profit!!!
De qualquer forma, estou divagando…
Então, depois de escrever meu pequeno aplicativo CLI Stampy, me deparei com um pequeno problema, como distribuí-lo? Eu fui pelo menos inteligente o suficiente para pensar e escrevê-lo em GoLang (por mais que eu quisesse apenas construí-lo em Python) para evitar a temida ira do Python Packaging. Uma coisa que sempre me deixou perplexo foi como as pessoas publicam seus ótimos aplicativos CLI em sistemas sofisticados de gerenciamento de pacotes, como APT e YUM.
Normalmente, para construir seu aplicativo, você faria apenas um simples go build . e boom, binário instantâneo. Por melhor que seja para desenvolvedores locais, não adianta muito para compilações entre plataformas. Existem alguns guias interessantes para mostrar como fazer isso, mas… tl;dr para o meu ??. Então eu fiz mais pesquisas, tinha que haver uma ferramenta legal… e com certeza, existe o GoReleaser!
Depois de ler uma documentação muito bem escrita, consegui fazer uma construção local rápida e fácil de usar em várias plataformas.
goreleaser --snapshot --clean
Fazer com que as compilações aconteçam com os lançamentos do GitHub também foi fácil, pois eles têm ótimas ações GH pré-escritas!
Os usuários agora podem simplesmente instalar meu aplicativo com ferramentas como eget (bom) e stew (muito melhor)!
Embora você também possa instalar github.com/xxx, tudo o que isso faria seria clonar o repositório, construí-lo localmente e colocar o lixo em sua pasta $ GOBIN. Não é realmente o mesmo que uma ferramenta adequada de gerenciamento de pacotes, mas funciona muito bem para pessoas que já têm o Go instalado. Não é realmente uma opção para o usuário médio IMHO. ?
E não só isso, GoReleaser também oferece embalagens! Então agora você pode criar facilmente DEBs e RPMs. Eu estava um passo mais perto do assustado apt-get install stampy. A única coisa que faltava era como criar um repositório APT. Esta última parte fundamental não é fácil, com certeza. Passei cerca de uma hora pensando em como auto-hospedar isso com GitHub Pages e, embora seja possível, era muito mais fácil usar apenas um serviço gratuito como o Packagecloud para lidar com a assinatura e hospedagem de repositório pelo baixo custo de $ 0 por mês?.
Você pode ver um exemplo de todo o fluxo de trabalho AQUI
Também incluirei uma versão simplificada dele aqui em um bloco de código, para qualquer um que se deparar com a própria postagem do blog.
Para uma visão geral de alto nível, o GHA faz o seguinte:
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
Você vai querer ter certeza de que coisas como a estrutura do programa e seu arquivo go.mod estão configurados corretamente, ou você terá problemas ao publicar seu aplicativo corretamente.
Nota lateral: você também pode distribuir seu aplicativo com Homebrew, mas não me preocupei devido à complexidade extra de GH Actions envolvendo segredos PAT e ao fato de que estou muito bem coberto com Apt, Yum, e Ensopado… saboroso! ?
Isso me leva à segunda grande coisa ao lançar um aplicativo. ?DOCUMENTATION? e o muito negligenciado Readme.md?!
Existem alguns elementos que acho que qualquer leia-me decente deveria ter, pois eles ajudarão seu aplicativo a se destacar de todos os aplicativos com pouca ou nenhuma documentação ou, pior ainda, com documentação ruim.
Eu recomendo fortemente que você siga este formato para criar seu próprio leia-me! Sou um grande fã de emblemas para talento, mas sinto que ter uma pequena demonstração GIF realmente mostra às pessoas do que se trata, assim como listar capturas de tela de seus aplicativos GUI. Usar ASCIINEMA foi bastante fácil, e eles também têm um ótimo conversor GIF para deixar tudo perfeito.
? Dica
Como observação, pedi ao CodeGPT que me escrevesse alguns testes de unidade GoLang, que eu sei que normalmente são dolorosos de escrever. É um plugin fantástico se você estiver no pacote JetBrains.
Semelhante a quando comecei a aprender como publicar aplicativos Python, estou feliz em poder dizer que sinto que posso distribuir adequadamente qualquer aplicativo que escrever no GoLang daqui para frente. É uma habilidade interessante que aprendi e, com esta postagem no blog, espero que possa ajudar outras pessoas a fazer o mesmo! Saúde!
-Comedor de gelatina
? Mastodonte | ? E-mail | ? Comentários | ☕ Compre um café para mim
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3