Heim > Backend-Entwicklung > Golang > Veröffentlichen von CLI-Apps (mit Apt & YUM)

Veröffentlichen von CLI-Apps (mit Apt & YUM)

Susan Sarandon
Freigeben: 2024-10-05 06:10:30
Original
883 Leute haben es durchsucht

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!!!



Nach dem Login kopieren

包装

无论如何,我离题了……

所以在编写我的小 CLI 应用程序 Stampy 后,我遇到了一个小问题,如何分发它?我至少足够聪明,能够思考并用 GoLang 编写它(就像我想用 Python 构建它一样)以避免 Python 包装的可怕愤怒。一直困扰我的一件事是,人们如何将他们漂亮的 CLI 应用程序发布到 APT 和 YUM 等精美的包管理系统。

通常要构建您的应用程序,您只需执行简单的 go build 即可。和繁荣,即时二进制。尽管这对于本地开发来说非常有用,但对于跨平台编译却没有多大好处。有一些很好的指南可以向您展示如何做到这一点,但是... tl;dr 我的??。所以我做了更多的挖掘,必须有一个不错的工具......当然,有 GoReleaser!

阅读了一些写得很好的文档后,我能够快速进行本地跨平台构建,非常简单。


goreleaser --snapshot --clean



Nach dem Login kopieren

使用 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 }}



Nach dem Login kopieren

ℹ️重要

您需要确保程序结构和 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.

Readme-Beispiel

  • Testabzeichen
  • GIF-Demo
  • Abdeckungsabzeichen
  • Zeugnis gehen
  • Installieren
    • Paketmanager (ex apt)
    • Binärinstallation (ex eget)
    • Los, Snip installieren
  • Verwendung
    • KLARE ANWEISUNGEN und Beispielcodeausschnitte
  • Einstellungen
    • Wo Einstellungen gespeichert werden
    • Verwenden Sie INI-Dateien, JSON, Env Vars?
  • So greifen Sie auf die integrierte Hilfe zu
  • So erstellen Sie die App aus dem Quellcode
  • Stand der Technik (auch bekannt als frühere Arbeit/Inspiration)

Einpacken

Ä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!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage