آموزش, اخبار, برنامه نویسی

محیط گلانگ – GOPATH در مقابل go.mod

در این مقاله، تفاوت‌های بین محیط سنتی GOPATH و محیط مبتنی بر go.mod برای برنامه‌نویسی Go را تحلیل خواهیم کرد.

این تمایز پیامدهای مهمی برای چگونگی ساختار و مدیریت توسعه دهندگان Go فضاهای کاری و وابستگی های پروژه خود دارد.

ما با درک محیط GOPATH ، سازمان و ساختار آن شروع خواهیم کرد. سپس رویکرد go.mod را که برای ارائه روشی مدولار و انعطاف‌پذیر برای سازماندهی پروژه‌های Go اتخاذ شده است، تحلیل می‌کنیم.

درک این دو محیط و انتقال از GOPATH به go.mod بینش های ارزشمندی را در مورد اکوسیستم در حال تکامل Go ارائه می دهد.

زبان برنامه نویسی Go در ابتدا محدوده ای را برای مکان وابستگی ها و پروژه های سفارشی در داخل یک سیستم فایل محدود می کرد. این توسط متغیر محیطی GOPATH تعریف شد. این بدان معنی است که Go فقط در زیر فهرستی که این متغیر به آن اشاره می کند، به دنبال باینری ها و کد منبع می گردد.

متغیر GOPATH به طور پیش‌فرض به یک پوشه /go اشاره می‌کند که مستقیماً در مسیر فهرست اصلی کاربر تعریف شده است ( ~/ در سیستم‌های مبتنی بر یونیکس یا %HOMEPATH% در سیستم‌های مبتنی بر ویندوز).

GOPATH همچنین می تواند روی مسیرهای سفارشی تنظیم شود، و بیش از یک GOPATH می تواند برای یک کاربر تعریف شود (اما به دلیل مشکلات اضافی در مدیریت وابستگی، از این کار جلوگیری شد).

سه دایرکتوری قابل توجه تحت GOPATH وجود دارد: src ، pkg و bin . دایرکتوری src کد منبع پروژه ها و وابستگی های نصب شده شما را نگه می دارد. وقتی دستوری مانند go get github.com/user/repo را اجرا می‌کنید، ابزار Go ماژول را از مکان مشخص شده واکشی می‌کند و آن را در فهرست src در زیر GOPATH قرار می‌دهد، با مسیری به نام URL منبع.

به عنوان مثال، اگر قرار بود یک کتابخانه را از یک مخزن متعلق به "someuser" در GitHub دانلود کنید، کد منبع کتابخانه در /home/user/go/src/github.com/someuser/library قرار می گیرد.

دایرکتوری pkg حاوی اشیاء بسته کامپایل شده (فایل های a.) است که کد شما به آنها بستگی دارد. هنگامی که یک بسته ساخته می شود، فایل حاصل در دایرکتوری pkg قرار می گیرد. فایل های بسته کامپایل شده به کاهش زمان کامپایل کمک می کنند زیرا می توان آنها را مستقیماً در بسته های دیگر بدون نیاز به کامپایل مجدد وارد کرد.

دایرکتوری bin فایل های اجرایی باینری برنامه های شما را نگه می دارد. هنگامی که یک برنامه اجرایی می سازید، فایل باینری حاصل در دایرکتوری bin قرار می گیرد.

درخت فایل برای یک فضای کاری GOPATH

این مسیر پیش فرض GOPATH را در نظر می گیرد:

 /home/user/go/ <--- This is your GOPATH ├── bin/ ├── pkg/ │ └── linux_amd64/ │ └── github.com/ │ └── someuser/ │ └── somelib.a <--- Compiled dependency package └── src/ ├── github.com/ │ └── someuser/ │ └── somelib/ <--- Dependency's source code │ └── somelib.go └── myapp/ <--- Your project └── main.go

در این ساختار:

دایرکتوری src حاوی کد منبع پروژه های شما و وابستگی های نصب شده است.

دایرکتوری pkg شامل نسخه های کامپایل شده بسته هایی است که کد شما به آنها بستگی دارد.

دایرکتوری bin شامل فایل های اجرایی باینری کامپایل شده است.

ساختار فضای کاری واحد تعریف شده توسط GOPATH به این معنی است که همه کد Go شما و وابستگی های آن در یک فضای مشترک مشترک هستند.

البته شایان ذکر است که این رویکرد با معرفی ماژول های Go در Go 1.11 تکامل یافته است. این عمدتاً به فقدان یک سیستم نسخه‌سازی مناسب برای وابستگی‌ها و انعطاف‌پذیری برای ذخیره پروژه‌ها تحت یک سیستم فایل می‌پردازد.

با شروع از Go 1.11 (اوت ۲۰۱۸)، گزینه مدولار به عنوان جایگزینی برای فضای کاری تعریف شده توسط GOPATH در دسترس قرار گرفت. این با وجود یک فایل go.mod و همچنین معمولاً یک فایل go.sum مشخص می شود که پس از اجرای هر عملیات مربوط به بسته های میزبان خارجی (مانند go get <package> ) ایجاد می شود.

با این حال، قبل از ادامه، مهم است که مشخص شود یک بسته چیست و چگونه یک ماژول با یک بسته متفاوت است:

بسته های در Go

بسته در Go کوچکترین واحد توزیع کد است. آنها توسط دایرکتوری حاوی یک یا چند فایل منبع .go با نام بسته اعلام شده در بالای آن تعریف می شوند. همه فایل های دایرکتوری باید یک نام بسته را اعلام کنند.

بسته ها امکان سازماندهی و استفاده مجدد کد را فراهم می کنند. آنها راهی برای کپسوله کردن کدهای مرتبط در یک واحد فراهم می کنند که می تواند توسط بسته های دیگر وارد و استفاده شود. به عنوان مثال کتابخانه استاندارد Go از بسته های زیادی مانند fmt، os، net و غیره تشکیل شده است.

یک نام بسته خاص وجود دارد، main . این بسته حاوی تابع main() است که نقطه ورود به پروژه است. هر پروژه ای که قرار است در نهایت به یک فایل اجرایی تبدیل شود باید تابع main() و در نتیجه بسته main باشد.

این یک تمرین خوب است که فایل(های) بسته اصلی را در پوشه ریشه پروژه و سایر بسته ها در دایرکتوری های خود اعلام کنید.

ماژول ها در Go

یک ماژول مجموعه ای از بسته های Go مرتبط است که با هم به عنوان یک واحد نسخه می شوند. ماژول ها الزامات وابستگی دقیق را ثبت می کنند و ساخت های قابل تکرار ایجاد می کنند.

یک ماژول Go توسط یک فایل go.mod تعریف می شود که در ریشه سلسله مراتب دایرکتوری ماژول قرار دارد. این فایل مسیر ماژول را تعریف می کند که پیشوند مسیر واردات برای همه بسته های داخل ماژول است. وابستگی های ماژول، از جمله نسخه های مورد نیاز ماژول های دیگر را مشخص می کند.

ماژول‌ها امکان نسخه‌سازی و انتشار مجموعه‌ای از بسته‌ها را با هم فراهم می‌کنند و همچنین اطلاعات نسخه وابستگی را صریح و مدیریت آسان‌تر می‌کنند. توجه داشته باشید که اگرچه نسخه‌بندی شده است، اما وابستگی‌ها همچنان تحت src که در محدوده GOPATH به طور پیش‌فرض تعریف شده است دانلود می‌شوند .

به طور خلاصه، در حالی که یک بسته راهی برای ساختاردهی و استفاده مجدد از کد در یک برنامه Go است، یک ماژول مجموعه‌ای از بسته‌ها است که مدیریت وابستگی را نیز مدیریت می‌کند. این به هر پروژه Go اجازه می دهد تا محیط ساخت جدا شده و قابل تکرار خود را داشته باشد.

قراردادهای نامگذاری برای ماژول ها

در Go، نام ماژول ها در سراسر سیستم استفاده می شود و پس باید تا حد امکان خاص باشد، به خصوص اگر قصد دارید ماژول را بین توسعه دهندگان دیگر توزیع کنید. نام ماژول در فایل go.mod مشخص شده است که به عنوان مانیفست ماژول عمل می کند و در ریشه سلسله مراتب دایرکتوری ماژول قرار دارد.

در اینجا چند دستورالعمل برای نامگذاری ماژول در Go آمده است:

مسیر ماژول : مسیر ماژول باید یک شناسه منحصر به فرد جهانی برای ماژول باشد. معمولاً به شکل یک نام دامنه اینترنتی به ترتیب معکوس و به دنبال آن نام ماژول است. به عنوان مثال، github.com/littlejohnny65/example-module . مسیر ماژول به عنوان مسیر واردات هنگام وارد کردن بسته ها از ماژول استفاده می شود.

نام ماژول : نام ماژول آخرین جزء مسیر ماژول است. باید کوتاه، توصیفی و مطابق با قراردادهای نامگذاری Go باشد. توصیه می شود از حروف کوچک بدون خط زیر یا حروف مختلط استفاده کنید. به عنوان مثال، examplemodule .

Versioning : نام ماژول خود شامل اطلاعات نسخه نمی شود. نسخه یک ماژول به طور جداگانه در فایل go.mod با استفاده از شناسه نسخه ماژول، مانند v1.2.3 مشخص شده است. ترکیب مسیر ماژول و شناسه نسخه به طور منحصر به فرد یک نسخه خاص از ماژول را شناسایی می کند.

مهم است که نام‌های معنی‌دار و توصیفی برای ماژول‌ها انتخاب کنید، زیرا آنها برای عموم قابل شناسایی هستند و ممکن است به عنوان وابستگی در پروژه‌های دیگر استفاده شوند. قراردادهای نامگذاری واضح و ثابت به درک هدف و زمینه یک ماژول کمک می کند.

فایل go.sum

وقتی دستوری مانند go get github.com/user/repo اجرا می‌کنید، ابزار Go ماژول را از آن مکان دریافت می‌کند. این امکان میزبانی کد Go را در هر سروری که از سیستم‌های کنترل نسخه مانند Git، Mercurial، Bazaar یا Subversion پشتیبانی می‌کند، ممکن می‌سازد.

Go یک رویکرد بسیار منعطف و مستقیم برای دانلود وابستگی ها از مخازن خارجی دارد. پس راه حل اتخاذ شده برای اطمینان از یکپارچگی وابستگی، ایجاد یک فایل محلی برای ذخیره یک چک‌سوم برای هر وابستگی است. این چیزی است که تضمین می کند که وابستگی نصب شده دقیقاً یکسان است.

فایل checksum توسط ابزار محلی Go تولید می شود. اگر می‌خواهید مطمئن شوید که وابستگی‌ها دقیقاً مشابه محیط محلی شما هستند ، باید به محیط‌های خارجی مانند سرورها و Dockerfiles منتقل شود .

درخت فایل برای پروژه مدولار Go

 /home/user/projects/ └── myapp/ # Your project ├── custom/ # Custom packages └── ... # .go files defining functionality ├── go.mod # go.mod file defining dependencies & versions ├── go.sum # go.sum file that verifies dependency integrity └── main.go # Entrypoint

درخت فایل برای کش ماژول، با فرض مسیر پیش فرض GOPATH:

 /home/user/go/ # This is your GOPATH └── pkg/ └── mod/ └── cache/ └── download/ └── github.com/ └── someuser/ └── somelib/ # Source code of the dependency └── somelib.go

در این ساختار:

پروژه شما می تواند در هر جایی از سیستم فایل شما زندگی کند. این شامل یک فایل go.mod و یک فایل go.sum است.

فایل go.mod نسخه‌های خاصی از وابستگی‌هایی را که پروژه شما استفاده می‌کند فهرست می‌کند.

فایل go.sum در زمانی که به ماژول شما اضافه می‌شود، محتویات دقیق هر وابستگی را تحلیل می‌کند.

وابستگی ها در حافظه پنهان ماژول Go ذخیره می شوند که در تمام پروژه های سیستم شما به اشتراک گذاشته می شود.

چندین دستور راحت برای کار با پروژه های Go مدولار وجود دارد:

go mod init : یک ماژول جدید را در فهرست فعلی راه اندازی می کند. یک فایل go.mod ایجاد می کند که مسیر ماژول را تعریف می کند و آن را برای مدیریت وابستگی تنظیم می کند.

go mod tidy : ماژول ها و وابستگی های استفاده نشده را اضافه می کند و از فایل go.mod حذف می کند. این تضمین می کند که فایل go.mod وابستگی های مورد نیاز پروژه شما را به دقت منعکس می کند.

go mod download : وابستگی های تعریف شده در فایل go.mod را دانلود کرده و در کش ماژول ذخیره می کند. این نسخه های خاص از وابستگی های مورد نیاز برای پروژه شما را واکشی می کند.

go mod vendor : وابستگی ها را در پوشه vendor در پروژه شما کپی می کند. این دستور زمانی مفید است که می خواهید یک پروژه مستقل ایجاد کنید که شامل تمام وابستگی های آن باشد.

go mod verify : تحلیل می‌کند که وابستگی‌های موجود در حافظه پنهان ماژول با جمع‌های کنترل رمزنگاری مورد انتظار مشخص‌شده در فایل go.sum مطابقت دارند. این یکپارچگی و صحت وابستگی های دانلود شده را تضمین می کند.

go mod graph : نمودار وابستگی ماژول را چاپ می کند و روابط بین ماژول ها و نسخه های آنها را نشان می دهد. می تواند برای درک ساختار کلی وابستگی های پروژه شما مفید باشد.

go mod edit : مجموعه ای از دستورات فرعی را برای ویرایش دستی فایل go.mod ارائه می دهد. این به شما امکان می دهد ملزومات ماژول را اضافه، حذف یا به روز کنید، ماژول ها را جایگزین کنید و موارد دیگر.

اینها تنها تعدادی از دستورات متداول go mod هستند. با اجرای go help mod یا مراجعه به مستندات رسمی Go در ماژول ها می توانید دستورات و گزینه های بیشتری را کشف کنید.

رویکرد مدولار به طور اساسی با فضای کاری منفرد متفاوت و ناسازگار نیست. اما بر روی آن استوار می شود تا انعطاف پذیری و مدیریت بیشتری را به ارمغان بیاورد.

ماژول‌ها به شما این امکان را می‌دهند که پروژه‌ای را در هر جایی که می‌خواهید در فایل سیستم خود داشته باشید و همچنین برای پایداری بهتر، وابستگی‌های فضای نامی داشته باشید. اما همچنان از GOPATH به عنوان مکان پیش فرض برای ذخیره وابستگی ها و فایل های اجرایی استفاده می کند.

در نتیجه، محیط ماژولار ارائه شده توسط go.mod یک ابزار قدرتمند در جعبه ابزار توسعه دهنده Go است که عملکرد محیط سنتی GOPATH را تکمیل و گسترش می دهد. این نشان دهنده انطباق Go با پیچیدگی و مقیاس روزافزون توسعه نرم افزار مدرن است و تکامل مداوم زبان را برای پاسخگویی به نیازهای متغیر کاربرانش نشان می دهد.

همانطور که به جلو می رویم، تصور اینکه تحولات آینده در اکوسیستم Go چه به همراه خواهد داشت هیجان انگیز است.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *