মডিউল পাঠ (4/5)
মডিউল যান
একটি গো মডিউল হল একটি সংস্করণযোগ্য ইউনিট যা এক বা একাধিক প্যাকেজ নিয়ে গঠিত। এটি আধুনিক নির্ভরতা ব্যবস্থার ভিত্তি (Go 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)
সংস্করণগুলি SemVer অনুসরণ করে: 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 প্রচেষ্টার পরে উপলব্ধ
fmt এবং os উভয় ইম্পোর্ট করে ইম্পোর্ট (... ) সিনট্যাক্স সহ পৃথক ইম্পোর্টগুলিকে একটি ইম্পোর্ট গ্রুপে পরিণত করুন৷
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
কোন কমান্ড go.mod থেকে আর আমদানি করা নির্ভরতাগুলিকে সরিয়ে দেয় এবং অনুপস্থিতগুলিকে যুক্ত করে?
$ go mod ???