首頁 > 後端開發 > Golang > 發布 CLI 應用程式(使用 Apt 和 YUM)

發布 CLI 應用程式(使用 Apt 和 YUM)

Susan Sarandon
發布: 2024-10-05 06:10:30
原創
883 人瀏覽過

Publishing CLI Apps (with Apt & YUM)

簡介

最近我已經成為 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 執行以下操作:

  • 寫出 GoReleaser 配置
  • 運行發佈器本身
  • 上傳下一個作業的 .debs
  • 在鍊式作業中,我們拉取 .deb 並將其上傳到 PackageCloud
  • 完成!

GitHub 操作範例


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 套件,這是一個很棒的插件。

自述文件範例

  • 測試徽章
  • GIF 示範
  • 覆蓋徽章
  • 去報告卡
  • 安裝
    • 套件管理器(ex apt)
    • 二進位安裝(例如 eget)
    • 去安裝片段
  • 用法
    • 清晰的說明和範例程式碼片段
  • 設定
    • 儲存設定的位置
    • 你使用 INI 檔、JSON、環境變數嗎?
  • 如何存取內建幫助
  • 如何從原始碼建立應用程式
  • 現有藝術(又稱以前的作品/靈感)

包起來

與我開始學習如何發布 Python 應用程式時類似,我很高興能夠說我覺得我可以正確分發我在 GoLang 中編寫的任何應用程式。這是我學到的一項巧妙的技能,透過這篇博文,我希望它可以幫助其他人做同樣的事情!乾杯!

-果凍


?乳齒象 | ?電子郵件 | ?評論 | ☕ 買杯咖啡給我

以上是發布 CLI 應用程式(使用 Apt 和 YUM)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板