"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > सीएलआई ऐप्स का प्रकाशन (एप्ट और यम के साथ)

सीएलआई ऐप्स का प्रकाशन (एप्ट और यम के साथ)

2024-11-08 को प्रकाशित
ब्राउज़ करें:958

Publishing CLI Apps (with Apt & YUM)

पहचान

हाल ही में मैं सीएलआई ऐप्स का काफी प्रशंसक बन गया हूं। शायद यह मेरे बचपन के टर्मिनल का आकर्षण है (486/33 पर DOS और मेरे पिता के पुराने Apple IIe से शुरू)। मैं जेन एक्स कमोडोर64 युग के लिए बहुत देर से पैदा हुआ था, लेकिन अभी विंडोज 95 के अलावा और अधिक जानने का समय है। यह दिलचस्प युग था, जब डायल अप और 56के मॉडेम राजा थे। मुझे पता है कि इन दिनों अधिकांश ब्लॉग पोस्ट में एसईओ के लिए शब्द गणना को कम करने के लिए इंट्रो फ़्लफ़ होता है, लेकिन वास्तव में यही कारण है कि मैं अभी भी सीएलआई को पसंद करता हूं, जबकि इन दिनों बहुत से युवा लोग केवल जीयूआई ऐप्स जानते हैं। जनरल ज़ेड के बच्चों को साधारण कार्यों के लिए भी टर्मिनल में आग उगलते हुए देखने से ज्यादा खुशी मुझे किसी और चीज़ से नहीं होती। यार, जनरल अल्फ़ा को यह पता चलने तक प्रतीक्षा करो कि बीबीएस क्या है। "दादाजी कंप्यूटर" वे शायद कहेंगे? "मेरे लॉन से हट जाओ" ✊✊

CLI प्यार को वापस लाने के लिए CoolRetroTerm जैसी परियोजनाएं निश्चित रूप से मेरे दिल में एक गर्मजोशी भरी जगह रखती हैं। मैं अभी भी माइक्रो में अपनी कुछ ब्लॉगिंग अपनी पुरानी नेटबुक पर करना पसंद करता हूं, आइए वास्तव में आप सिर्फ लिखने पर ध्यान केंद्रित करें। मुझे लगता है कि VSCode ZenMode और MarkText करीब आ गए हैं?


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



पैकेजिंग

वैसे भी, मैं विषयांतर कर रहा हूं...

तो अपना छोटा सीएलआई ऐप स्टैम्पी लिखने के बाद मुझे एक छोटी सी समस्या का सामना करना पड़ा, इसे कैसे वितरित किया जाए? मैं कम से कम इतना समझदार था कि पाइथॉन पैकेजिंग के भयानक प्रकोप से बचने के लिए इसे GoLang में लिख सकता था (जितना मैं इसे पाइथॉन में बनाना चाहता था)। एक बात जिसने मुझे हमेशा आश्चर्यचकित किया है, वह यह कि लोग अपने अच्छे सीएलआई ऐप्स को एपीटी और वाईयूएम जैसे फैंसी पैकेज प्रबंधन सिस्टम पर कैसे प्रकाशित करते हैं।

आम तौर पर अपना ऐप बनाने के लिए आपको बस एक साधारण गो बिल्ड करना होगा। और बूम, तत्काल बाइनरी। यह स्थानीय विकास के लिए जितना अच्छा है, यह क्रॉस प्लेटफ़ॉर्म संकलन के लिए उतना अच्छा नहीं है। आपको यह कैसे करना है यह दिखाने के लिए कुछ अच्छे मार्गदर्शक हैं, लेकिन... tl;dr मेरे लिए ??। इसलिए मैंने कुछ और खोजबीन की, वहाँ एक अच्छा उपकरण होना चाहिए... और निश्चित रूप से, वहाँ GoReleaser है!

कुछ बहुत अच्छी तरह से लिखे गए दस्तावेज़ों को पढ़ने के बाद, मैं एक त्वरित स्थानीय क्रॉस प्लेटफ़ॉर्म निर्माण करने में सक्षम हुआ, जो आसान है।


goreleaser --snapshot --clean



GitHub रिलीज़ के साथ निर्माण करना भी आसान था, क्योंकि उनके पास पहले से लिखी गई अच्छी GH क्रियाएँ हैं!

उपयोगकर्ता अब ईगेट (अच्छा) और स्टू (बहुत बेहतर) जैसे टूल के साथ मेरा ऐप इंस्टॉल कर सकते हैं!

हालांकि आप github.com/xxx भी इंस्टॉल कर सकते हैं, बस रेपो को क्लोन करना होगा, इसे स्थानीय रूप से बनाना होगा, और बिन को अपने $GOBIN फ़ोल्डर में डालना होगा। वास्तव में उचित पैकेज प्रबंधन टूलींग के समान नहीं है, लेकिन उन लोगों के लिए चुटकी में काम करता है जिनके पास पहले से ही गो इंस्टॉल है । वास्तव में औसत उपयोगकर्ता IMHO के लिए कोई विकल्प नहीं है। ?

और इतना ही नहीं, GoReleaser पैकेजिंग भी प्रदान करता है! तो अब आप आसानी से DEB और RPM तैयार कर सकते हैं। मैं डरे हुए एप्ट-गेट इंस्टाल स्टैम्पी के एक कदम और करीब था। केवल एक चीज गायब थी कि एपीटी रेपो कैसे बनाया जाए। यह अंतिम मुख्य भाग निश्चित रूप से आसान नहीं है। मैंने लगभग एक घंटा यह जानने में बिताया कि GitHub पेजों के साथ इसे स्वयं कैसे होस्ट किया जाए, और हालांकि यह संभव है, $0 प्रति की कम लागत पर हस्ताक्षर और रेपो होस्टिंग को संभालने के लिए पैकेजक्लाउड जैसी मुफ्त सेवा का उपयोग करना कहीं अधिक आसान था। महीना?।

आप संपूर्ण वर्कफ़्लो का एक उदाहरण यहां देख सकते हैं

मैं यहां एक कोड ब्लॉक में इसका एक छोटा संस्करण भी शामिल करूंगा, किसी भी व्यक्ति के लिए जो ब्लॉग पोस्ट को देखेगा।

उच्च स्तरीय अवलोकन के लिए GHA निम्नलिखित कार्य करता है:

  • वह GoReleaser कॉन्फिगरेशन लिखता है
  • रिलीज़र स्वयं चलाता है
  • अगली नौकरी के लिए .debs अपलोड करता है
  • जंजीर वाली नौकरी में, हम .deb को खींचते हैं और इसे पैकेजक्लाउड पर अपलोड करते हैं
  • हो गया!

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 फ़ाइल जैसी चीजें ठीक से सेटअप हैं, या आपको अपने ऐप को ठीक से प्रकाशित करने में समस्याओं का सामना करना पड़ेगा।

साइड नोट: आप अपना ऐप होमब्रू के साथ भी वितरित कर सकते हैं, लेकिन पीएटी रहस्यों से जुड़ी अतिरिक्त जीएच क्रियाओं की जटिलता और इस तथ्य के कारण कि मैं एप्ट के साथ बहुत अच्छी तरह से कवर हूं, मुझे कोई परेशानी नहीं हुई। यम, और स्टू... स्वादिष्ट! ?

किसी ऐप को जारी करते समय यह मुझे दूसरी बड़ी चीज़ की ओर ले जाता है। ?दस्तावेज़ीकरण? और बहुत उपेक्षित Readme.md?!

रीडमी फ़ॉर्मेटिंग

कुछ ऐसे तत्व हैं जो मुझे लगता है कि किसी भी अच्छे रीडमी में होने चाहिए, क्योंकि वे आपके ऐप को उन सभी ऐप्स से अलग दिखने में मदद करेंगे जिनके पास बहुत कम या कोई दस्तावेज़ीकरण नहीं है, या इससे भी बदतर, खराब दस्तावेज़ीकरण है।

मैं अत्यधिक अनुशंसा करता हूं कि आप अपना स्वयं का रीडमी तैयार करने के लिए इस प्रारूप का पालन करें! मैं स्वभाव के लिए बैज का बहुत बड़ा प्रशंसक हूं, लेकिन मुझे ऐसा लगता है कि एक छोटा सा GIF डेमो वास्तव में लोगों को दिखाता है कि यह क्या है, जैसे आपके जीयूआई ऐप्स के स्क्रीनशॉट को सूचीबद्ध करना। ASCIINEMA का उपयोग करना काफी आसान था, और उनके पास सब कुछ सही दिखने के लिए एक अच्छा GIF कनवर्टर भी है।

? बख्शीश

एक साइड नोट के रूप में मैंने CodeGPT से मुझे कुछ GoLang यूनिट परीक्षण लिखने को कहा, जिनके बारे में मुझे पता है कि उन्हें लिखना आम तौर पर दर्दनाक होता है। यदि आप JetBrains सुइट पर हैं तो यह एक शानदार प्लगइन है।

रीडमी उदाहरण

  • परीक्षण बैज
  • जीआईएफ डेमो
  • कवरेज बैज
  • जाओ रिपोर्ट कार्ड
  • स्थापित करना
    • पैकेज प्रबंधक (पूर्व उपयुक्त)
    • बाइनरी इंस्टॉल (उदा.ईगेट)
    • स्निप इंस्टॉल करें
  • उपयोग
    • स्पष्ट निर्देश और उदाहरण कोड स्निप्स
  • सेटिंग्स
    • जहां सेटिंग्स सहेजी जाती हैं
    • क्या आप INI फ़ाइलें, JSON, Env Vars का उपयोग करते हैं?
  • अंतर्निहित सहायता तक कैसे पहुंचें
  • स्रोत से ऐप कैसे बनाएं
  • पूर्व कला (उर्फ पिछला काम/प्रेरणा)

लपेटें

जैसे ही मैंने पाइथॉन ऐप्स को प्रकाशित करना सीखा, मुझे यह कहते हुए खुशी हो रही है कि मुझे लगता है कि मैं आगे चलकर GoLang में लिखे गए किसी भी ऐप को ठीक से वितरित कर सकता हूं। यह एक अच्छा कौशल है जिसे मैंने सीखा है, और इस ब्लॉग पोस्ट के साथ, मुझे उम्मीद है कि यह दूसरों को भी ऐसा करने में मदद कर सकता है! प्रोत्साहित करना!

-जेलोईटर


? मैस्टोडॉन | ? ईमेल | ? टिप्पणियाँ | ☕ मेरे लिए एक कॉफ़ी खरीदें

विज्ञप्ति वक्तव्य इस लेख को पुन: प्रस्तुत किया गया है: https://dev.to/jelloeater/publishing-cli- apps-with-apt-yum-568c?1 यदि कोई उल्लंघन है, तो कृपया इसे हटाने के लिए [email protected] से संपर्क करें।
नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3