私は最近、CLI アプリのファンになっています。おそらくそれは、私の子供時代の端末 (486/33 の DOS や父の古い Apple IIe から始まりました) の魅力なのかもしれません。私は Gen X Commodore64 の時代には少し遅すぎましたが、Windows 95 だけではなく、それ以上のことを知るにはちょうど間に合いました。ダイヤルアップと 56k モデムが主流だった興味深い時代でした。最近のほとんどのブログ投稿には、SEO のために文字数を増やすためにイントロが冗長になっているのは知っていますが、これが、最近の若い人たちの多くが GUI アプリしか知らない中で、私が今でも CLI を愛する理由でもあります。 Z 世代の子供たちが、たとえ簡単な作業であってもターミナルを起動するのを見るのが、これほど嬉しいことはありません。アルファ世代が BBS とは何かを知るまで待ってください。 「おじいちゃんコンピューター」と彼らは言うでしょう? 「芝生から出て行け」✊✊
CoolRetroTerm のようなプロジェクトは、CLI への愛を取り戻すために、間違いなく私の心の中に暖かい場所を持っています。私は今でも、ブログの一部を古い Netbook の Micro で行うことを好みます。本当に、書くことだけに集中できます。 VSCode ZenMode と MarkText はかなり近いものなのではないでしょうか?
flowchart LR Build_App --> GH_Actions --> ??? --> Profit!!!
それはともかく、余談ですが…
小さな CLI アプリ Stampy を作成した後、小さな問題に遭遇しました。それをどのように配布するか?少なくとも、私は Python パッケージングの恐ろしい怒りを避けるために (Python でビルドしたいのと同じくらい) GoLang で書くことを頭で考えるだけの賢さはありました。私がいつも困惑していることの 1 つは、人々がどのようにして素晴らしい CLI アプリを APT や YUM などの高級なパッケージ管理システムに公開するかということでした。
通常、アプリをビルドするには、単純な go build を実行するだけです。そしてブーム、インスタントバイナリ。これはローカル開発にとっては素晴らしいことですが、クロスプラットフォームのコンパイルにはあまり役に立ちません。その方法を示す素晴らしいガイドがいくつかありますが…私の ?? については、お読みください。そこで、さらに詳しく調べてみると、優れたツールがなければなりませんでした…そして、確かに、GoReleaser がありました!
非常によく書かれたドキュメントを読んだ後、簡単にローカルのクロスプラットフォーム ビルドを行うことができました。
goreleaser --snapshot --clean
GitHub リリースでは、事前に作成された優れた GH アクションがあるため、ビルドを実行するのも簡単でした!
ユーザーは、eget (優れた) や シチュー (はるかに優れた) などのツールを使用して私のアプリをインストールできるようになりました!
github.com/xxx をインストールすることもできますが、これで行われるのは、リポジトリのクローンを作成し、ローカルでビルドし、ビンを $GOBIN フォルダーに置くことだけです。適切なパッケージ管理ツールと実際には同じではありませんが、すでに Go をインストールしているにとっては、いざという時に機能します。私の意見では、平均的なユーザーにとっては実際には選択肢ではありません。 ?
それだけではなく、GoReleaser はパッケージングも提供しています。これで、DEB と RPM を簡単に作成できるようになりました。恐怖の apt-get install stampy にまた一歩近づきました。唯一欠けていたのは、APT リポジトリの作成方法でした。この最後の重要な部分は確かに簡単ではありません。私はこれを GitHub Pages でセルフホストする方法を検討するのに 1 時間ほど費やしました。それは実行可能ですが、Packagecloud のような無料サービスを使用して、1 件あたり 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 で十分にカバーされているという事実のため、私は気にしませんでした。 おいしい、そしてシチュー…おいしい! ?
これは、アプリをリリースするときの重要な 2 番目の事柄につながります。 ?DOCUMENTATION?、そして無視されていた Readme.md?!
まともな Readme には必要だと思う要素がいくつかあります。これらの要素は、ドキュメントがほとんど、あるいはまったくない、あるいは最悪の場合、ドキュメントが不十分なアプリの中であなたのアプリを目立たせるのに役立ちます。
独自の Readme を作成するには、この形式に従うことを強くお勧めします。私はセンスを表すバッジの大ファンですが、GUI アプリの スクリーンショット をリストするのと同じように、小さな GIF デモを作成することで、それが何であるのかを人々に実際に示すことができると感じています。 ASCIINEMA の使用は非常に簡単で、すべてを正しく表示するための優れた GIF コンバーターも備えています。
?ヒント
余談ですが、私は CodeGPT にいくつかの GoLang 単体テストを書いてもらいましたが、これを書くのは通常大変なことだとわかっています。 JetBrains スイートを使用している場合、これは素晴らしいプラグインです。
私が Python アプリの公開方法を学び始めたときと同じように、今後は GoLang で作成したアプリを適切に配布できると感じていると言えてうれしいです。これは私が習得した素晴らしいスキルであり、このブログ投稿が他の人にも同じように役立つことを願っています。乾杯!
-ジェロイーター
?マストドン | ?電子メール | ?コメント | ☕ コーヒーを買ってきて
以上がCLI アプリの公開 (Apt および YUM を使用)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。