Ich bin in letzter Zeit ein großer Fan von CLI-Apps geworden. Vielleicht ist es der Reiz des Terminals meiner Kindheit (angefangen mit DOS auf einem 486/33 und dem alten Apple IIe meines Vaters). Ich wurde etwas zu spät für die Commodore64-Ära der Generation Ich weiß, dass die meisten Blog-Beiträge heutzutage Einleitungsfloskeln haben, um die Wortzahl für SEO zu reduzieren, aber das ist wirklich der Grund, warum ich die CLI immer noch liebe, wenn heutzutage so viele jüngere Leute nur GUI-Apps kennen. Nichts macht mich glücklicher, als zu sehen, wie Kinder der Generation Z das Terminal starten, selbst für einfache Aufgaben. Mann, warte, bis Gen Alpha herausfindet, was ein BBS ist. „Opa-Computer“ werden sie wahrscheinlich sagen? „Raus von meinem Rasen“ ✊✊
Projekte wie CoolRetroTerm haben definitiv einen warmen Platz in meinem Herzen, weil sie die CLI-Liebe zurückbringen. Ich blogge immer noch lieber in Micro auf meinem alten Netbook, damit Sie sich wirklich auf das Schreiben konzentrieren können. VSCode ZenMode und MarkText kommen mir nahe, denke ich?
flowchart LR Build_App --> GH_Actions --> ??? --> Profit!!!
Wie auch immer, ich schweife ab…
Nachdem ich meine kleine CLI-App Stampy geschrieben hatte, stieß ich auf ein kleines Problem: Wie soll ich sie verteilen? Ich war zumindest schlau genug, mir einen Kopf auszudenken und ihn in GoLang zu schreiben (so sehr ich ihn auch einfach in Python erstellen wollte), um dem gefürchteten Zorn der Python-Verpackung zu entgehen. Eine Sache, die mich immer verblüfft hat, war, wie Leute ihre netten CLI-Apps in schicken Paketverwaltungssystemen wie APT und YUM veröffentlichen.
Normalerweise würden Sie zum Erstellen Ihrer App einfach einen einfachen Go-Build ausführen. und boom, sofortige Binärdatei. So großartig das auch für lokale Entwickler ist, für plattformübergreifende Kompilierungen nützt es nicht viel. Es gibt einige nette Anleitungen, die Ihnen zeigen, wie es geht, aber ... was soll's für meine ???. Also habe ich noch ein bisschen gestöbert, es musste ein nettes Werkzeug sein … und zum Teufel gibt es GoReleaser!
Nachdem ich einige sehr gut geschriebene Dokumentationen durchgelesen hatte, war ich in der Lage, ganz einfach einen schnellen lokalen plattformübergreifenden Build durchzuführen.
goreleaser --snapshot --clean
Builds mit GitHub-Releases umzusetzen war ebenfalls einfach, da sie über nette vorab geschriebene GH-Aktionen verfügen!
Benutzer können meine App jetzt einfach mit Tools wie Eget (gut) und Stew (viel besser) installieren!
Sie können zwar auch github.com/xxx installieren, dazu müssten Sie lediglich das Repo klonen, es lokal erstellen und die Bin in Ihrem $GOBIN-Ordner ablegen. Nicht wirklich dasselbe wie ein richtiges Paketverwaltungstool, funktioniert aber zur Not für Leute, die Go bereits installiert haben. Für den durchschnittlichen Benutzer meiner Meinung nach keine wirkliche Option. ?
Und nicht nur das, GoReleaser bietet auch Verpackungen an! Jetzt können Sie ganz einfach DEBs und RPMs erstellen. Ich war dem verängstigten apt-get install stampy einen Schritt näher gekommen. Es fehlte nur noch, wie man ein APT-Repo erstellt. Dieser letzte wichtige Teil ist sicherlich nicht einfach. Ich habe ungefähr eine Stunde damit verbracht, herauszufinden, wie ich das mit GitHub Pages selbst hosten kann, und obwohl es machbar ist, war es weitaus einfacher, einfach einen kostenlosen Dienst wie Packagecloud zu nutzen, um das Signieren und Repo-Hosting zu den geringen Kosten von 0 $ pro Stück zu übernehmen Monat?.
Ein Beispiel des gesamten Workflows können Sie HIER sehen
Ich werde hier auch eine abgespeckte Version davon in einen Codeblock einfügen, für alle, die über den Blog-Beitrag selbst stolpern.
Für einen allgemeinen Überblick führt die GHA Folgendes durch:
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 }}
ℹ️ Wichtig
Sie sollten sicherstellen, dass Dinge wie die Programmstruktur und Ihre go.mod-Datei ordnungsgemäß eingerichtet sind. Andernfalls treten Probleme bei der ordnungsgemäßen Veröffentlichung Ihrer App auf.
Randbemerkung: Sie können Ihre App auch mit Homebrew verteilen, aber ich habe mich nicht darum gekümmert, da die GH-Aktionen mit PAT-Geheimnissen zusätzlich komplex sind und ich mit Apt ziemlich gut vertraut bin. Lecker und Eintopf… lecker! ?
Das führt mich zum großen zweiten Punkt bei der Veröffentlichung einer App. ?DOKUMENTATION? und die viel vernachlässigte Readme.md?!
Es gibt ein paar Elemente, die meiner Meinung nach in jeder anständigen Readme-Datei enthalten sein sollten, da sie dazu beitragen, dass sich Ihre App von allen Apps mit wenig oder gar keiner Dokumentation oder, noch schlimmer, schlechter Dokumentation abhebt.
Ich empfehle Ihnen dringend, dieses Format für die Erstellung Ihrer eigenen Readme-Datei zu befolgen! Ich bin ein großer Fan von Abzeichen für Flair, aber ich habe das Gefühl, dass eine kleine GIF-Demo den Leuten wirklich zeigt, worum es geht, genau wie das Auflisten von Screenshots Ihrer GUI-Apps. Die Verwendung von ASCIINEMA war recht einfach und sie haben auch einen schönen GIF-Konverter, damit alles genau richtig aussieht.
? Tipp
Als Randbemerkung habe ich mir von CodeGPT einige GoLang-Unit-Tests schreiben lassen, von denen ich weiß, dass das Schreiben normalerweise mühsam ist. Es ist ein fantastisches Plugin, wenn Sie die JetBrains-Suite nutzen.
Ähnlich wie damals, als ich lernen wollte, wie man Python-Apps veröffentlicht, bin ich froh, sagen zu können, dass ich das Gefühl habe, dass ich in Zukunft jede App, die ich in GoLang schreibe, ordnungsgemäß verteilen kann. Es ist eine nette Fähigkeit, die ich mir angeeignet habe, und ich hoffe, dass ich mit diesem Blogbeitrag anderen dabei helfen kann, dasselbe zu tun! Prost!
-Jelloeater
? Mastodon | ? E-Mail | ? Kommentare | ☕ Kauf mir einen Kaffee
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3