В последнее время я стал большим поклонником приложений 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 долларов за штуку. месяц?.
Пример всего рабочего процесса можно увидеть ЗДЕСЬ
Я также включу урезанную версию сюда, в блок кода, для всех, кто случайно наткнется на сам пост в блоге.
Для обзора высокого уровня ГСГ делает следующее:
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: YOUbindir: /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.
Подобно тому, как я намеревался научиться публиковать приложения Python, я рад иметь возможность сказать, что чувствую, что могу правильно распространять любое приложение, которое я пишу на GoLang, в будущем. Это отличный навык, который я приобрел, и я надеюсь, что эта статья в блоге поможет другим сделать то же самое! Ваше здоровье!
-Джеллоед
? Мастодонт | ? Электронная почта | ? Комментарии | ☕Купи мне кофе
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3