मॉड्यूल पाठ (4/5)
जाओ मॉड्यूल
एक गो मॉड्यूल एक संस्करण योग्य इकाई है जो एक या अधिक पैकेजों से बनी होती है। यह आधुनिक निर्भरता प्रणाली (गो 1.11+) की नींव है: कोई और अधिक GOPATH नहीं, कोई और अनिवार्य vendor नहीं, स्पष्ट और प्रतिलिपि प्रस्तुत करने योग्य निर्भरताएँ।
go.mod: मॉड्यूल मेनिफेस्ट
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 कमांड द्वारा स्वचालित रूप से अपडेट किया जाता है।
आवश्यक आदेश
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 graphgo mod tidy वह है जिसे आप आयात में प्रत्येक परिवर्तन के बाद चलाते हैं: यह गारंटी देता है कि go.mod वास्तव में उपयोग किए गए पैकेजों को दर्शाता है।
सिमेंटिक इंपोर्ट वर्जनिंग (SIV)
संस्करण सेमवीर का अनुसरण करते हैं: v1.2.3 = MAJOR.MINOR.PATCH। दिलचस्प हिस्सा है प्रमुख v2+:
- प्रमुख
v0औरv1→ सामान्य पथ:github.com/foo/bar। - प्रमुख
v2या बाद का → पथ प्रमुख संस्करण शामिल है:github.com/foo/bar/v2।
import "github.com/foo/bar/v2"यह आपको एक ही समय में एक ही लाइब्रेरी के v1 और v2 दोनों को आयात करने देता है (प्रगतिशील माइग्रेशन के दौरान उपयोगी)।
आयात पथ और आंतरिक पैकेज
यदि आपका मॉड्यूल example.com/myapp है, तो एक utils/ उप-फ़ोल्डर इस प्रकार आयात किया जाता है:
import "example.com/myapp/utils"पथ केवल go.mod में घोषित नाम पर निर्भर करता है, डिस्क पर स्थान पर नहीं: एक अलग फ़ोल्डर में एक ही कोड काम करता रहता है।
कार्यक्षेत्र मोड (1.18+ पर जाएं)
एक ही समय में एक-दूसरे को संदर्भित करने वाले एकाधिक मॉड्यूल पर काम करने के लिए (उदाहरण के लिए एक लाइब्रेरी और एक ऐप जो इसका उपयोग करता है):
go work init ./lib ./appइससे go.work बनता है: go build प्रकाशित संस्करण को डाउनलोड करने के बजाय ./lib के स्थानीय संस्करण का उपयोग करेगा। go.work प्रतिबद्ध न हों (यह एक विकास वातावरण है)।
अभ्यास
मॉड्यूल example.com/myapp है और इसमें एक यूटिल्स उप-फ़ोल्डर है। पूर्ण पथ का उपयोग करके उप-पैकेज को मुख्य में आयात करें।
संकेत दिखाएँ
आयात पथ मॉड्यूल नाम (go.mod से) और फ़ोल्डर का सापेक्ष पथ है।
3 प्रयासों के बाद समाधान उपलब्ध है
एफएमटी और ओएस दोनों को आयात करते हुए, आयात (...) सिंटैक्स के साथ व्यक्तिगत आयात को एक आयात समूह में बदलें।
3 प्रयासों के बाद समाधान उपलब्ध है
कौन सा कमांड उन निर्भरताओं को हटाता है जो अब go.mod से आयात नहीं की जाती हैं और गायब निर्भरता को जोड़ देता है?
$ go mod ???