«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Публикация приложений CLI (с Apt и YUM)

Публикация приложений CLI (с Apt и YUM)

Опубликовано 8 ноября 2024 г.
Просматривать:673

Publishing CLI Apps (with Apt & YUM)

Введение

В последнее время я стал большим поклонником приложений CLI. Возможно, это очарование терминала моего детства (начиная с DOS на 486/33 и старого Apple IIe моего отца). Я родился слишком поздно для эпохи Commodore64 поколения X, но как раз вовремя, чтобы знать больше, чем просто Windows 95. Это была интересная эпоха, когда королем был коммутируемый доступ и модемы 56k. Я знаю, что большинство сообщений в блогах в наши дни содержат вступительные слова, чтобы увеличить количество слов для SEO, но именно поэтому я до сих пор люблю CLI, хотя в наши дни так много молодых людей знают только приложения с графическим интерфейсом. Ничто не делает меня более счастливым, чем видеть, как дети поколения Z запускают терминал даже для выполнения простых задач. Чувак, подожди, пока генерал Альфа узнает, что такое BBS. «Дедушкины компьютеры» наверное скажут?. “ПОЙДИТЕ С МОЕЙ ГАЗОНКИ” ✊✊

Такие проекты, как CoolRetroTerm, определенно занимают теплое место в моем сердце, поскольку они вернули любовь к CLI. Я по-прежнему предпочитаю вести блог в Micro на своем старом нетбуке, так что давайте сосредоточимся только на написании статей. Думаю, VSCode ZenMode и MarkText близки?


flowchart LR
Build_App --> GH_Actions --> ??? --> Profit!!!



Упаковка

В общем, я отвлекся…

Итак, после написания моего маленького CLI-приложения Stampy, я столкнулся с небольшой проблемой: как его распространять? По крайней мере, я был достаточно умен, чтобы подумать и написать это на GoLang (настолько же мне хотелось просто собрать его на Python), чтобы избежать ужасного гнева Python Packaging. Меня всегда ставило в тупик то, как люди публикуют свои хорошие приложения CLI в модных системах управления пакетами, таких как APT и YUM.

Обычно для создания приложения достаточно выполнить простую сборку. и бум, мгновенный двоичный код. Как бы хорошо это ни было для локальной разработки, для кроссплатформенных компиляций это бесполезно. Есть несколько хороших руководств, которые покажут вам, как это сделать, но… спасибо за мой ??. Итак, я покопался еще немного, должен был быть хороший инструмент… и, черт возьми, есть GoReleaser!

Прочитав очень хорошо написанную документацию, я смог быстро и легко выполнить локальную кроссплатформенную сборку.


goreleaser --snapshot --clean



Выполнить сборку с помощью выпусков GitHub также было легко, поскольку у них есть хорошие заранее написанные действия GH!

Теперь пользователи могут просто установить мое приложение с помощью таких инструментов, как eget (хорошо) и stew (намного лучше)!

Хотя вы также можете установить github.com/xxx, все, что вам нужно сделать, это клонировать репозиторий, собрать его локально и поместить корзину в папку $GOBIN. На самом деле это не то же самое, что полноценный инструмент управления пакетами, но в крайнем случае работает для людей, , у которых уже установлен Go. ИМХО, не совсем вариант для обычного пользователя. ?

И не только это, GoReleaser также предлагает упаковку! Итак, теперь вы можете легко создавать DEB и RPM. Я был на шаг ближе к испуганному стэмпу apt-get install. Единственное, чего не хватало, — это создания репозитория APT. Эта последняя ключевая часть, конечно, непростая. Я потратил около часа на изучение того, как самостоятельно разместить это на GitHub Pages, и, хотя это выполнимо, было гораздо проще просто использовать бесплатный сервис, такой как Packagecloud, для управления хостингом подписи и репо по низкой цене 0 долларов за штуку. месяц?.

Пример всего рабочего процесса можно увидеть ЗДЕСЬ

Я также включу урезанную версию сюда, в блок кода, для всех, кто случайно наткнется на сам пост в блоге.

Для обзора высокого уровня ГСГ делает следующее:

  • Записывает конфигурацию 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  /tmp/goreleaser-github.yaml
          project_name: EXAMPLE
          version: 2
          builds:
            - env: [CGO_ENABLED=0]
              goos:
                - linux
              goarch:
                - amd64
          nfpms:
            -
              maintainer: YOU 
              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/[email protected]
        with:
          package-name: ./*.deb
          packagecloud-username: USERNAME
          packagecloud-reponame: APP_NAME
          packagecloud-distro: ${{ matrix.distro }}
          packagecloud-token: ${{ secrets.PACKAGECLOUD_TOKEN }}




ℹ️ Важно

Вам необходимо убедиться, что такие вещи, как структура программы и файл go.mod, настроены правильно, иначе у вас возникнут проблемы с правильной публикацией приложения.

Примечание: вы также можете распространять свое приложение с помощью Homebrew, но я не стал заморачиваться из-за дополнительной сложности GH Actions, связанной с секретами PAT, и того факта, что я довольно хорошо владею Apt, Ням и Тушеное мясо… вкусно! ?

Это подводит меня ко второму важному моменту при выпуске приложения. ?ДОКУМЕНТАЦИЯ? и забытый Readme.md?!

Форматирование файла ознакомительных сведений

Есть несколько элементов, которые, по моему мнению, должны быть в любом приличном файле readme, поскольку они помогут вашему приложению выделиться среди всех приложений, практически не имеющих документации или, что еще хуже, плохой документации.

Я настоятельно рекомендую вам следовать этому формату для создания собственного файла readme! Я большой поклонник значков для изящества, но мне кажется, что небольшая демо-версия GIF действительно покажет людям, о чем идет речь, так же, как список скриншотов ваших приложений с графическим интерфейсом. Использовать ASCIINEMA было достаточно просто, и у них также есть хороший конвертер GIF, благодаря которому все выглядит правильно.

? Кончик

Кстати, CodeGPT написал мне несколько модульных тестов GoLang, писать которые, как я знаю, обычно больно. Это фантастический плагин, если вы пользуетесь пакетом JetBrains.

Пример ознакомительного файла

  • Тестовые значки
  • Демо GIF
  • Значки освещения
  • Табель успеваемости Go
  • Установить
    • Менеджер пакетов (примерно)
    • Двоичная установка (например, eget)
    • Перейти к установке
  • Использование
    • ПОНЯТНЫЕ ИНСТРУКЦИИ и примеры кода
  • Настройки
    • Где сохраняются настройки
    • Используете ли вы файлы INI, JSON, Env Vars?
  • Как получить доступ к встроенной справке
  • Как собрать приложение из исходного кода
  • Предыдущее искусство (также известное как предыдущая работа/вдохновение)

Заворачивать

Подобно тому, как я намеревался научиться публиковать приложения Python, я рад иметь возможность сказать, что чувствую, что могу правильно распространять любое приложение, которое я пишу на GoLang, в будущем. Это отличный навык, который я приобрел, и я надеюсь, что эта статья в блоге поможет другим сделать то же самое! Ваше здоровье!

-Джеллоед


? Мастодонт | ? Электронная почта | ? Комментарии | ☕Купи мне кофе

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/jelloeater/publishing-cli-apps-with-apt-yum-568c?1. Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить ее.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3