ماژولها و ساختهای قابل تکرار (Modules and Reproducible Builds)
حالا که درایور MySQL نصب شده است، بیایید نگاهی به فایل go.mod بیندازیم (که در همان ابتدای کتاب آن را ایجاد کردیم). شما باید یک بلوک require (نیازمندیها) با دو خط حاوی مسیر و شماره نسخه دقیق پکیجهایی که دانلود کردید را ببینید:
module snippetbox.letsgofa.net
go 1.23.0
require (
filippo.io/edwards25519 v1.1.0 // indirect
github.com/go-sql-driver/mysql v1.8.1 // indirect
)
این خطوط در go.mod اساساً به دستور Go میگویند که دقیقاً از کدام نسخه پکیج (Package Version) باید هنگام اجرای دستوری مانند go run، go test یا go build از دایرکتوری پروژه شما استفاده شود.
این باعث میشود که داشتن چندین پروژه روی یک ماشین که از نسخههای مختلف یک پکیج (Different Package Versions) استفاده میکنند، آسان شود. برای مثال، این پروژه از نسخه v1.8.1 درایور MySQL استفاده میکند، اما شما میتوانید کد دیگری روی کامپیوتر خود داشته باشید که از نسخه v1.5.0 استفاده میکند و این کاملاً قابل قبول است.
همچنین خواهید دید که یک فایل جدید به نام go.sum در ریشه دایرکتوری پروژه شما ایجاد شده است.
این فایل go.sum شامل مجموعهای رمزنگاری شده است که محتوای پکیجهای مورد نیاز را نشان میدهد. اگر آن را باز کنید باید چیزی شبیه به این را ببینید:
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
فایل go.sum برای ویرایش دستی طراحی نشده است و معمولاً نیازی به باز کردن آن نخواهید داشت. اما دو عملکرد مفید دارد:
اگر دستور
go mod verifyرا از ترمینال خود اجرا کنید، این دستور تأیید میکند که مجموعهای رمزنگاری شده پکیجهای دانلود شده روی ماشین شما با ورودیهای موجود درgo.sumمطابقت دارند، بنابراین میتوانید مطمئن باشید که تغییر نکردهاند.$ go mod verify all modules verified
اگر شخص دیگری نیاز به دانلود تمام وابستگیهای پروژه داشته باشد — که میتواند با اجرای
go mod downloadانجام دهد — در صورت عدم تطابق بین پکیجهایی که دانلود میکند و مجموعهای رمزنگاری شده در فایل، خطایی دریافت خواهد کرد.
پس، به طور خلاصه:
- شما (یا شخص دیگری در آینده) میتوانید
go mod downloadرا اجرا کنید تا نسخههای دقیق تمام پکیجهایی که پروژه شما نیاز دارد را دانلود کنید. - شما میتوانید
go mod verifyرا اجرا کنید تا اطمینان حاصل کنید که هیچ چیز در آن پکیجهای دانلود شده به طور غیرمنتظره تغییر نکرده است. - هر زمان که
go run،go testیاgo buildرا اجرا میکنید، همیشه از نسخههای دقیق پکیجهای ذکر شده درgo.modاستفاده خواهد شد.
و این موارد در کنار هم باعث میشود که ایجاد ساختهای قابل تکرار از برنامههای Go شما بسیار آسانتر شود.
اطلاعات تکمیلی (Additional Information)
ارتقای پکیجها (Upgrading Packages)
پس از اینکه یک پکیج دانلود شد و به فایل go.mod شما اضافه شد، پکیج و نسخه آن 'ثابت' میشوند. اما دلایل زیادی وجود دارد که ممکن است بخواهید در آینده از نسخه جدیدتری از یک پکیج استفاده کنید.
برای ارتقا به آخرین نسخه جزئی یا اصلاح موجود یک پکیج، میتوانید به سادگی go get را با پرچم -u اجرا کنید:
$ go get -u github.com/foo/bar
یا به طور متناوب، اگر میخواهید به یک نسخه خاص ارتقا پیدا کنید، باید همان دستور را با پسوند @version مناسب اجرا کنید. برای مثال:
$ go get -u github.com/foo/bar@v2.0.0
حذف پکیجهای استفاده نشده (Removing Unused Packages)
گاهی اوقات ممکن است یک پکیج را با go get نصب کنید و بعداً متوجه شوید که دیگر به آن نیاز ندارید. در این صورت دو انتخاب دارید.
میتوانید یا go get را اجرا کنید و مسیر پکیج را با @none پسوند دهید:
$ go get github.com/foo/bar@none
یا اگر تمام ارجاعات به پکیج را در کد خود حذف کردهاید، میتوانید go mod tidy را اجرا کنید، که به طور خودکار هر پکیج استفاده نشده را از فایلهای go.mod و go.sum شما حذف میکند.
$ go mod tidy
واژهنامه اصطلاحات فنی
| اصطلاح فارسی | معادل انگلیسی | توضیح |
|---|---|---|
| ماژولها | Modules | واحدهای مستقل کد در Go که شامل مجموعهای از پکیجهای مرتبط هستند |
| ساختهای قابل تکرار | Reproducible Builds | فرآیند ساخت نرمافزار که همیشه خروجی یکسانی تولید میکند |
| نیازمندیها | Requirements | پکیجها و وابستگیهایی که برای اجرای برنامه مورد نیاز هستند |
| نسخه پکیج | Package Version | شماره نسخه مشخص یک پکیج که نشاندهنده تغییرات و ویژگیهای آن است |
| وابستگیهای غیرمستقیم | Indirect Dependencies | پکیجهایی که مستقیماً در کد استفاده نمیشوند اما توسط سایر وابستگیها مورد نیاز هستند |
| مجموع رمزنگاری شده | Cryptographic Checksum | مقدار هش که برای تأیید یکپارچگی محتوای پکیج استفاده میشود |
| ارتقای پکیجها | Upgrading Packages | فرآیند بهروزرسانی پکیجها به نسخههای جدیدتر |
| پکیجهای استفاده نشده | Unused Packages | پکیجهایی که در پروژه نصب شدهاند اما دیگر مورد استفاده قرار نمیگیرند |