最近我已经成为 CLI 应用程序的忠实粉丝。也许这是我童年时期终端的诱惑(从 486/33 上的 DOS 和我父亲的旧 Apple IIe 开始)。对于 X 代 Commodore64 时代,我出生得有点晚,但正好赶上了了解 Windows 95 之外的更多内容。那是一个有趣的时代,当时拨号和 56k 调制解调器还是王者。我知道现在大多数博客文章都有一些介绍性的内容,以增加 SEO 的字数,但这确实是为什么我仍然喜欢 CLI,因为现在很多年轻人只知道 GUI 应用程序。没有什么比看到 Z 世代的孩子打开终端更让我高兴的了,即使是为了简单的任务。伙计,等阿尔法一代知道什么是 BBS 吧。他们可能会说“电脑爷爷”? “离开我的草坪”✊✊
像 CoolRetroTerm 这样的项目在我心中肯定有一个温暖的地方,因为它带回了对 CLI 的热爱。我仍然更喜欢在我的旧上网本上用 Micro 写一些博客,真的让你专注于写作。我猜 VSCode ZenMode 和 MarkText 很接近?
flowchart LR Build_App --> GH_Actions --> ??? --> Profit!!!
无论如何,我离题了……
所以在编写我的小 CLI 应用程序 Stampy 后,我遇到了一个小问题,如何分发它?我至少足够聪明,能够思考并用 GoLang 编写它(就像我想用 Python 构建它一样)以避免 Python 包装的可怕愤怒。一直困扰我的一件事是,人们如何将他们漂亮的 CLI 应用程序发布到 APT 和 YUM 等精美的包管理系统。
通常要构建您的应用程序,您只需执行简单的 go build 即可。和繁荣,即时二进制。尽管这对于本地开发来说非常有用,但对于跨平台编译却没有多大好处。有一些很好的指南可以向您展示如何做到这一点,但是... tl;dr 我的??。所以我做了更多的挖掘,必须有一个不错的工具......当然,有 GoReleaser!
阅读了一些写得很好的文档后,我能够快速进行本地跨平台构建,非常简单。
goreleaser --snapshot --clean
使用 GitHub 版本进行构建也很容易,因为它们有很好的预先编写的 GH 操作!
用户现在只需使用 eget(好)和 Steute(更好)等工具安装我的应用程序即可!
虽然您也可以安装 github.com/xxx,但所有要做的就是克隆存储库,在本地构建它,然后将 bin 放入您的 $GOBIN 文件夹中。与正确的包管理工具并不完全相同,但对于已经安装了 Go 的人来说确实可以工作。恕我直言,对于普通用户来说这并不是一个真正的选择。 ?
不仅如此,GoReleaser 还提供包装!现在您可以轻松制作 DEB 和 RPM。我离害怕的 apt-get install stampy 又近了一步。唯一缺少的是如何创建 APT 存储库。这最后一个关键部分肯定并不容易。我花了一个小时左右的时间研究如何使用 GitHub Pages 自行托管它,虽然这是可行的,但使用像 Packagecloud 这样的免费服务来处理签名和存储库托管要容易得多,而且成本低廉,每次 0 美元月?.
您可以在此处查看整个工作流程的示例
我还将在代码块中包含它的精简版本,供任何偶然发现博客文章本身的人使用。
为了获得高层次的概述,GHA 执行以下操作:
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 << EOF > /tmp/goreleaser-github.yaml project_name: EXAMPLE version: 2 builds: - env: [CGO_ENABLED=0] goos: - linux goarch: - amd64 nfpms: - maintainer: YOU <your@email.com> bindir: /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/packagecloud-github-action@v0.6 with: package-name: ./*.deb packagecloud-username: USERNAME packagecloud-reponame: APP_NAME packagecloud-distro: ${{ matrix.distro }} packagecloud-token: ${{ secrets.PACKAGECLOUD_TOKEN }}
ℹ️重要
您需要确保程序结构和 go.mod 文件等内容正确设置,否则您将在正确发布应用程序时遇到问题。
旁注:您还可以使用 Homebrew 分发您的应用程序,但我没有打扰,因为涉及 PAT 秘密的额外 GH 操作复杂性以及我已经很好地覆盖了 Apt, 好吃,还有炖菜…好吃! ?
这让我想到了发布应用程序时的第二件事。 ?文档? 以及备受忽视的 Readme.md?!
我认为任何像样的自述文件都应该具有一些元素,因为它们将帮助您的应用程序从所有几乎没有文档,或者更糟糕的是,糟糕的文档的应用程序中脱颖而出。
Ich empfehle Ihnen dringend, dieses Format zum Erstellen 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
Das obige ist der detaillierte Inhalt vonVeröffentlichen von CLI-Apps (mit Apt & YUM). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!