最近我已經成為 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? !
我認為任何像樣的自述文件都應該具有一些元素,因為它們將幫助您的應用程式從所有幾乎沒有文檔,或者更糟的是,糟糕的文檔的應用程式中脫穎而出。
我強烈建議您遵循這種格式來製作自己的自述文件!我是天賦徽章的忠實粉絲,但我覺得有一個 GIF 演示確實可以向人們展示它的含義,就像列出 GUI 應用程序的 屏幕截圖 一樣。使用 ASCIINEMA 非常簡單,而且他們還有一個很好的 GIF 轉換器,讓一切看起來都恰到好處。
?提示
順便說一句,我確實讓 CodeGPT 給我寫了一些 GoLang 單元測試,我知道寫這些測試通常很痛苦。如果您使用 JetBrains 套件,這是一個很棒的插件。
與我開始學習如何發布 Python 應用程式時類似,我很高興能夠說我覺得我可以正確分發我在 GoLang 中編寫的任何應用程式。這是我學到的一項巧妙的技能,透過這篇博文,我希望它可以幫助其他人做同樣的事情!乾杯!
-果凍
?乳齒象 | ?電子郵件 | ?評論 | ☕ 買杯咖啡給我
以上是發布 CLI 應用程式(使用 Apt 和 YUM)的詳細內容。更多資訊請關注PHP中文網其他相關文章!