"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > نشر تطبيقات CLI (باستخدام Apt وYUM)

نشر تطبيقات CLI (باستخدام Apt وYUM)

تم النشر بتاريخ 2024-11-08
تصفح:533

Publishing CLI Apps (with Apt & YUM)

مقدمة

لقد أصبحت معجبًا جدًا بتطبيقات CLI مؤخرًا. ربما يكون السبب هو جاذبية محطة طفولتي (بدءًا من DOS على 486/33 وجهاز Apple IIe القديم الخاص بوالدي). لقد ولدت متأخرًا بعض الشيء بالنسبة لعصر Gen X Commodore64، ولكن في الوقت المناسب لمعرفة المزيد عن Windows 95 فقط. لقد كان عصرًا مثيرًا للاهتمام، عندما كان الاتصال الهاتفي وأجهزة المودم 56 كيلو بايت هو الملك. أعلم أن معظم منشورات المدونات هذه الأيام تحتوي على مقدمة زغبية، لزيادة عدد الكلمات لتحسين محركات البحث، ولكن هذا هو السبب في أنني ما زلت أحب واجهة سطر الأوامر (CLI) عندما لا يعرف الكثير من الشباب هذه الأيام سوى تطبيقات واجهة المستخدم الرسومية (GUI). لا شيء يجعلني أكثر سعادة من رؤية أطفال الجيل Z وهم يقومون بتشغيل الجهاز، حتى في المهام البسيطة. يا رجل، انتظر حتى يكتشف الجنرال ألفا ما هو BBS. ربما سيقولون "أجهزة كمبيوتر الجد"؟ "اخرج من حديقتي" ✊✊

من المؤكد أن مشاريع مثل CoolRetroTerm لها مكان دافئ في قلبي، لاستعادة حب CLI. ما زلت أفضّل أن أقوم ببعض مدوناتي بلغة Micro على جهاز Netbook القديم الخاص بي، فلنركز حقًا على الكتابة فقط. أعتقد أن VSCode ZenMode و MarkText يقتربان؟


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



التعبئة والتغليف

على أية حال، أنا استطرادا...

إذن بعد كتابة تطبيق CLI الصغير الخاص بي Stampy، واجهت مشكلة صغيرة، كيف يمكنني توزيعه؟ لقد كنت على الأقل ذكيًا بما يكفي للتفكير في كتابته في GoLang (بقدر ما كنت أرغب في بنائه في Python) لتجنب غضب Python Packaging المخيف. الشيء الوحيد الذي كان يحيرني دائمًا هو كيفية نشر الأشخاص لتطبيقات CLI الرائعة الخاصة بهم لأنظمة إدارة الحزم الفاخرة مثل APT وYUM.

عادةً لإنشاء تطبيقك، ما عليك سوى إجراء عملية إنشاء بسيطة. والازدهار، ثنائي فوري. على الرغم من روعة هذا بالنسبة للمطورين المحليين، إلا أنه لا يفيد كثيرًا عمليات التجميع عبر الأنظمة الأساسية. هناك بعض الإرشادات الرائعة التي توضح لك كيفية القيام بذلك، ولكن… tl;dr بالنسبة لي؟؟. لذلك قمت بمزيد من البحث، وكان لا بد من وجود أداة رائعة... وبالتأكيد، هناك GoReleaser!

بعد قراءة بعض الوثائق المكتوبة بشكل جيد للغاية، تمكنت من إنشاء بناء محلي سريع عبر الأنظمة الأساسية، وهو أمر سهل.


goreleaser --snapshot --clean



كان تنفيذ الإصدارات باستخدام إصدارات GitHub أمرًا سهلاً أيضًا، نظرًا لأنها تحتوي على إجراءات GH مكتوبة مسبقًا!

يمكن للمستخدمين الآن تثبيت تطبيقي باستخدام أدوات مثل eget (جيد) والحساء (طريقة أفضل)!

بينما يمكنك أيضًا تثبيت github.com/xxx، كل ما سيفعله هذا هو استنساخ الريبو، وإنشائه محليًا، ووضع السلة في مجلد GOBIN $ الخاص بك. لا تشبه حقًا أدوات إدارة الحزم المناسبة، ولكنها تعمل بشكل مناسب للأشخاص الذين قاموا بالفعل بتثبيت Go . ليس حقًا خيارًا للمستخدم العادي IMHO. ?

وليس ذلك فحسب، تقدم GoReleaser التغليف أيضًا! حتى الآن يمكنك بسهولة صياغة DEBs وRPMs. لقد كنت على بعد خطوة واحدة من apt-get install stampy الخائف. الشيء الوحيد المفقود هو كيفية إنشاء مستودع APT. هذا الجزء الرئيسي الأخير ليس سهلاً بالتأكيد. لقد أمضيت ساعة أو نحو ذلك في البحث عن كيفية استضافة هذا الأمر ذاتيًا باستخدام صفحات GitHub، وعلى الرغم من إمكانية تنفيذ ذلك، إلا أنه كان من الأسهل بكثير استخدام خدمة مجانية مثل Packagecloud للتعامل مع التوقيع واستضافة الريبو بتكلفة منخفضة منخفضة تبلغ 0 دولارًا أمريكيًا لكل شهر؟.

يمكنك مشاهدة مثال لسير العمل بأكمله هنا

سأقوم أيضًا بتضمين نسخة مختصرة منه هنا في مقطع برمجي، لأي شخص يعثر على مشاركة المدونة نفسها.

للحصول على نظرة عامة عالية المستوى، يقوم GHA بما يلي:

  • يكتب تكوين GoReleaser
  • يقوم بتشغيل المُحرر نفسه
  • تحميل ملف .debs للمهمة التالية
  • في المهمة المتسلسلة، نقوم بسحب ملف .deb وتحميله إلى PackageCloud
  • منتهي!

مثال على إجراءات جيثب


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 الذي يتضمن أسرار PAT وحقيقة أنني مغطى جيدًا بـ Apt، يم، و يخنة… لذيذة! ?

يقودني هذا إلى الشيء الثاني المهم عند إصدار التطبيق. ?الوثائق? وReadme.md المهمل كثيرًا؟!

تنسيق الملف التمهيدي

هناك بعض العناصر التي أعتقد أنه يجب أن يمتلكها أي ملف تمهيدي لائق، لأنها ستساعد تطبيقك على التميز من بين جميع التطبيقات مع القليل من الوثائق أو بدونها، أو الأسوأ من ذلك، وثائق سيئة.

أوصي بشدة باتباع هذا التنسيق لصياغة الملف التمهيدي الخاص بك! أنا من أشد المعجبين بالشارات الخاصة بالذوق، ولكني أرغب في الحصول على عرض توضيحي صغير لـ GIF يُظهر للأشخاص ما يدور حوله، تمامًا مثل إدراج لقطات شاشة لتطبيقات واجهة المستخدم الرسومية الخاصة بك. كان استخدام ASCIINEMA سهلاً بما فيه الكفاية، كما أن لديهم محول GIF الرائع أيضًا لجعل كل شيء يبدو على ما يرام.

؟ نصيحة

كملاحظة جانبية، طلبت من CodeGPT أن يكتب لي بعض اختبارات وحدة GoLang، والتي أعرف أنها عادة ما تكون مؤلمة عند كتابتها. إنه مكون إضافي رائع إذا كنت تستخدم مجموعة JetBrains.

مثال التمهيدي

  • شارات الاختبار
  • عرض GIF
  • شارات التغطية
  • بطاقة تقرير الذهاب
  • ثَبَّتَ
    • مدير الحزم (مثالي)
    • التثبيت الثنائي (ex 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