मुख्य सामग्री पर जाएं
मॉड्यूल 9 · पाठ 4 का 5पाठ्यक्रम में 44/50~12 min
मॉड्यूल पाठ (4/5)

जाओ मॉड्यूल

एक गो मॉड्यूल एक संस्करण योग्य इकाई है जो एक या अधिक पैकेजों से बनी होती है। यह आधुनिक निर्भरता प्रणाली (गो 1.11+) की नींव है: कोई और अधिक GOPATH नहीं, कोई और अनिवार्य vendor नहीं, स्पष्ट और प्रतिलिपि प्रस्तुत करने योग्य निर्भरताएँ।

go.mod: मॉड्यूल मेनिफेस्ट

Code
module example.com/myapp

go 1.22

require (
    github.com/google/uuid v1.6.0
    golang.org/x/time     v0.5.0
)

तीन मुख्य निर्देश:

  • module <path> - मॉड्यूल का आयात पथ। सभी आंतरिक पैकेज example.com/myapp/sub/pkg के रूप में आयात किए जाते हैं। इसका वास्तविक URL होना आवश्यक नहीं है, लेकिन go get के माध्यम से प्रकाशित करने के लिए इसे हल करना होगा।
  • go <version> - आवश्यक न्यूनतम गो संस्करण (यह नियंत्रित करने के लिए भी उपयोग किया जाता है कि कौन सी भाषा सुविधाओं की अनुमति है, उदाहरण के लिए 1.23 में रेंज-ओवर-फंक)।
  • require — उनके सटीक संस्करण के साथ प्रत्यक्ष निर्भरताएँ।

अन्य निर्देश: replace (डिप को कांटे या स्थानीय पथ से प्रतिस्थापित करता है), exclude, retract।

go.sum: क्रिप्टोग्राफ़िक लॉकफ़ाइल

go.mod के साथ, go.sum में प्रत्येक डाउनलोड किए गए संस्करण (परिवर्तनीय निर्भरता सहित) का एक क्रिप्टोग्राफ़िक हैश शामिल है। यह पुनरुत्पादन की गारंटी देता है: यदि कोई प्रकाशित संस्करण के साथ छेड़छाड़ करता है, तो निर्माण विफल हो जाता है।

इसे हमेशा प्रतिबद्ध रखें। यह go कमांड द्वारा स्वचालित रूप से अपडेट किया जाता है।

आवश्यक आदेश

Bash
go mod init example.com/myapp        # create go.mod
go get github.com/google/uuid        # add the dep at its latest version
go get github.com/google/uuid@v1.5.0 # specific version
go get -u ./...                      # upgrade every dep
go mod tidy                          # remove unused deps, add missing ones
go mod download                      # download everything into the cache
go mod why github.com/x/y            # explain why a dep is included
go mod graph                         # full dependency graph

go mod tidy वह है जिसे आप आयात में प्रत्येक परिवर्तन के बाद चलाते हैं: यह गारंटी देता है कि go.mod वास्तव में उपयोग किए गए पैकेजों को दर्शाता है।

सिमेंटिक इंपोर्ट वर्जनिंग (SIV)

संस्करण सेमवीर का अनुसरण करते हैं: v1.2.3 = MAJOR.MINOR.PATCH। दिलचस्प हिस्सा है प्रमुख v2+:

  • प्रमुख v0 और v1 → सामान्य पथ: github.com/foo/bar।
  • प्रमुख v2 या बाद का → पथ प्रमुख संस्करण शामिल है: github.com/foo/bar/v2।
Go
import "github.com/foo/bar/v2"

यह आपको एक ही समय में एक ही लाइब्रेरी के v1 और v2 दोनों को आयात करने देता है (प्रगतिशील माइग्रेशन के दौरान उपयोगी)।

आयात पथ और आंतरिक पैकेज

यदि आपका मॉड्यूल example.com/myapp है, तो एक utils/ उप-फ़ोल्डर इस प्रकार आयात किया जाता है:

Go
import "example.com/myapp/utils"

पथ केवल go.mod में घोषित नाम पर निर्भर करता है, डिस्क पर स्थान पर नहीं: एक अलग फ़ोल्डर में एक ही कोड काम करता रहता है।

कार्यक्षेत्र मोड (1.18+ पर जाएं)

एक ही समय में एक-दूसरे को संदर्भित करने वाले एकाधिक मॉड्यूल पर काम करने के लिए (उदाहरण के लिए एक लाइब्रेरी और एक ऐप जो इसका उपयोग करता है):

Bash
go work init ./lib ./app

इससे go.work बनता है: go build प्रकाशित संस्करण को डाउनलोड करने के बजाय ./lib के स्थानीय संस्करण का उपयोग करेगा। go.work प्रतिबद्ध न हों (यह एक विकास वातावरण है)।

अभ्यास

व्यायाम#go.m9.l4.e1
प्रयास: 0लोड हो रहा है...

मॉड्यूल example.com/myapp है और इसमें एक यूटिल्स उप-फ़ोल्डर है। पूर्ण पथ का उपयोग करके उप-पैकेज को मुख्य में आयात करें।

संपादक लोड हो रहा है...
संकेत दिखाएँ

आयात पथ मॉड्यूल नाम (go.mod से) और फ़ोल्डर का सापेक्ष पथ है।

3 प्रयासों के बाद समाधान उपलब्ध है

व्यायाम#go.m9.l4.e2
प्रयास: 0लोड हो रहा है...

एफएमटी और ओएस दोनों को आयात करते हुए, आयात (...) सिंटैक्स के साथ व्यक्तिगत आयात को एक आयात समूह में बदलें।

संपादक लोड हो रहा है...

3 प्रयासों के बाद समाधान उपलब्ध है

Quiz#go.m9.l4.e3
तैयार

कौन सा कमांड उन निर्भरताओं को हटाता है जो अब go.mod से आयात नहीं की जाती हैं और गायब निर्भरता को जोड़ देता है?

Go
$ go mod ???
उत्तर विकल्प