بسیاری از زبانهای برنامهنویسی مدرن به توسعهدهندگان اجازه میدهند تا کتابخانههای آماده برای استفاده را توزیع کنند و زبان Go نیز از این قاعده مستثنی نیست. در حالی که بعضی زبانها از یک مخزن مرکزی برای نصب این کتابخانهها استفاده میکنند، Go آنها را مستقیماً از مخزن کنترل نسخهای که کتابخانه در آن ساخته شده منتشر میکند. همچنین Go از سیستم نسخهبندی معنایی (Semantic Versioning) استفاده میکند تا تغییرات انجام شده را به گونهای به کاربران نشان دهد که بدانند آیا نسخه جدیدتر ماژول ایمن برای بهروزرسانی است یا خیر و نرمافزار آنها با ماژول به درستی کار کند.
در این آموزش، شما یک ماژول جدید ساخته و منتشر میکنید، نحوه استفاده از نسخهبندی معنایی را یاد میگیرید و یک نسخه معنایی از ماژول خود را منتشر خواهید کرد.
ساخت ماژول جدید
برخلاف بسیاری از زبانهای برنامهنویسی، یک ماژول Go مستقیماً از مخزن کد منبع که در آن قرار دارد منتشر میشود و مستقل از مخزنهای بستهبندی نیست. این موضوع یافتن ماژولهایی که در کد استفاده شدهاند و همچنین انتشار نسخههای جدید ماژول برای نگهدارندگان آنها را سادهتر میکند. ابتدا شما یک ماژول جدید میسازید و آن را بعداً منتشر خواهید کرد تا برای دیگر کاربران در دسترس باشد.
برای شروع ساخت ماژول خود، ابتدا مخزن خالی که ساختید را با دستور git clone روی کامپیوتر خود دانلود میکنید. این مخزن میتواند در هر جایی از کامپیوترتان قرار بگیرد، اما بسیاری از توسعهدهندگان پوشهای به نام projects برای پروژهها دارند.
پوشه projects را ساخته و به آن بروید:
mkdir projects
cd projects
از داخل پوشه projects، با دستور git clone مخزن خود را کپی کنید:
git clone git@github.com:your_github_username/pubmodule.gitاین کار یک پوشه به نام pubmodule در داخل projects ایجاد میکند که ماژول خالی شما در آن قرار دارد. ممکن است هشدار مبنی بر اینکه مخزن خالی است ببینید که جای نگرانی ندارد.
حالا وارد این پوشه شوید:
cd pubmoduleدر این مرحله از دستور go mod init برای ایجاد ماژول خود استفاده کنید و مسیر مخزن را به عنوان نام ماژول وارد کنید. نام ماژول باید با مسیر مخزن شما مطابقت داشته باشد تا ابزار Go بتواند ماژول را هنگام استفاده در پروژههای دیگر پیدا کند:
go mod init github.com/your_github_username/pubmoduleGo با ایجاد فایل go.mod تایید میکند که ماژول ساخته شده است.
سپس با ویرایشگر متن مورد علاقه خود (مانند nano)، فایلی با همان نام مخزن یعنی pubmodule.go ایجاد کنید و باز کنید.
نام این فایل میتواند هر چیزی باشد اما نام یکسان با بسته به شما کمک میکند تا شروع به کار با بسته را راحتتر کنید. همچنین نام بسته باید با نام مخزن یکسان باشد تا در صورتی که کسی یک تابع یا نوع را استفاده کرد، مانند pubmodule.MyFunction، بفهمد فراخوانی از کجا آمده است.
در فایل pubmodule.go، متدی به نام Hello اضافه کنید که رشته Hello, You! را برگرداند. این متد برای هر کسی که بسته شما را وارد میکند قابل استفاده خواهد بود:
package pubmodule
func Hello() string {
return "Hello, You!"
}
انتشار ماژول
اکنون ماژول محلی شما ساخته شده است و باید آن را برای دیگران منتشر کنید. چون ماژولهای Go مستقیماً از مخازن کد منبع منتشر میشوند، کد خود را به مخزن Git محلی کامیت کرده و سپس به مخزن خود در گیتهاب (github.com/your_github_username/pubmodule) پوش میکنید.
قبل از کامیت کردن، بهتر است مطمئن شوید که هیچ فایل ناخواستهای را به اشتراک نمیگذارید. با دستور git status میتوانید وضعیت فایلها و تغییرات را ببینید:
git statusباید فایل go.mod و فایل pubmodule.go را ببینید. در شاخه پیشفرض مخزنتان (معمولاً main یا master) باشید.
حالا فایلها را برای کامیت آماد کرده و کامیت کنید:
git add .
git commit -m "Initial commit with pubmodule and Hello method"و سپس تغییرات را به مخزن ارسال کنید:
git push origin mainحالا ماژول شما در مخزن گیتهاب قرار دارد و دیگران میتوانند از آن استفاده کنند. اگر نسخهای از ماژول منتشر نکرده باشید، Go از کد در شاخه پیشفرض برای ماژول استفاده میکند.
درک نسخهبندی معنایی (Semantic Versioning)
با اینکه ماژول منتشر شده، نگهداری آن به صورتی است که کاربران بتوانند یک نسخه پایدار از آن را مصرف کنند. شما ممکن است ویژگیها و تغییرات جدیدی اضافه کنید اما اگر آنها را بدون نسخه منتشر کنید احتمال خراب شدن کد کاربران وجود دارد. این مشکل با نسخهبندی معنایی حل میشود. نسخههای ماژول که با SemVer مشخص میشوند به شما و کاربران نشان میدهند که چقدر میتوانند بهروزرسانی کنند بدون اینکه کدشان خراب شود.
نسخه SemVer معمولاً به شکل سه عدد اصلی است: نسخه اصلی (major)، فرعی (minor) و اصلاحی (patch). مثلاً نسخه 1.2.3 شامل: نسخه اصلی ۱، فرعی ۲ و اصلاحی ۳ است. افزایش هر کدام از شمارهها نشانگر میزان تغییرات است:
- نسخه اصلی: تغییرات بزرگ که سازگاری قبلی را میشکنند.
- نسخه فرعی: افزودن ویژگیهای جدید بدون شکستن کد قبلی.
- نسخه اصلاحی: رفع اشکالات بدون تغییر در API.
هر بار که بخشی افزایش مییابد، شمارههای بعدی صفر میشوند. مثلاً افزایش نسخه فرعی از 1.3.10 به 1.4.0 میرود.
با این روش Go میداند که کدام نسخه جدیدتر است و میتواند تصمیم بگیرد که کدام نسخه را ارتقا بدهد یا نصب کند.
مثالهایی از تغییرات نسخه
تغییر نسخه اصلی
اگر توابعی مانند UserAddress دارید که نوع پارامتر یا مقدار بازگشتی آن را تغییر دهید، مثلاً از رشته به ساختار *Address تغییر دهید، این یک تغییر ناسازگار است و باید نسخه اصلی افزایش یابد:
// تغییر تابع UserAddress از بازگرداندن رشته به بازگرداندن *Address (major version bump)یا افزودن پارامتر جدید به تابع UserAddress نیز یک تغییر ناسازگار است و نسخه اصلی باید افزایش یابد.
تغییر نسخه فرعی
اگر تابع جدیدی به نام UserAddressDetail اضافه کنید که عملکرد جدیدی دارد اما توابع قبلی بدون تغییر بمانند، این یک تغییر سازگار است و نسخه فرعی افزایش مییابد.
تغییر نسخه اصلاحی
رفع اشکالاتی که فقط در درستی دادهها یا عملکرد داخلی ماژول است و تاثیری بر API ندارد، باعث افزایش نسخه اصلاحی میشود. مثل اصلاح نقص در تابع UserAddress که داده اشتباه برمیگرداند.
انتشار نسخه جدید
حال که تغییرات جدیدی به ماژول اضافه کردهاید، مانند افزودن متد Goodbye، باید نسخه جدیدی منتشر کنید که نشاندهنده نوع تغییر باشد.
در فایل pubmodule.go متد Goodbye را به صورت زیر اضافه کنید:
func Goodbye() string {
return "Goodbye, You!"
}
و سپس تغییرات را
git status چک کرده و
git add pubmodule.go
git commit -m "Added Goodbye method"
git push origin main
قبل از انتشار نسخه جدید باید تصمیم بگیرید چه نوع افزایش نسخهای مدنظر است. افزودن متد جدید (نسبت به نسخه قبل فقط متد Hello بود) سازگار عقبماندگی است و باید نسخه فرعی افزایش یابد. از آنجا که هنوز نسخه قبلی منتشر نشده (میتوان 0.0.0 را «بدون نسخه» در نظر گرفت)، نسخه بعدی باید v0.1.0 باشد.
برای انتشار نسخه جدید از git tag استفاده کنید و نسخه را با پیشوند v مشخص کنید:
git tag v0.1.0حالا تگ را به مخزن ارسال کنید:
git push origin v0.1.0با این کار نسخه v0.1.0 ماژول شما به عنوان نسخه رسمی منتشر شده در دسترس کاربران قرار میگیرد و از این به بعد زمانی که کاربری go get میزند، نسخههای رسمی را دریافت خواهد کرد و نه صرفاً آخرین کد commit شده.
جمعبندی
در این آموزش شما یاد گرفتید چطور یک ماژول عمومی Go بسازید و آن را روی مخزن GitHub (که به جای DigitalOcean از ParminCloud میتوانید استفاده کنید) منتشر کنید تا دیگران بتوانند استفاده کنند. همچنین با مفهوم نسخهبندی معنایی آشنا شدید تا هنگام انتشار نسخهها، کاربرانتان دچار مشکل نشوند. در نهایت ماژول خود را با افزودن متد جدید گسترش دادید و نسخه جدید را منتشر کردید.
برای اطلاعات بیشتر درباره Semantic Versioning به سایت semver.org مراجعه و درباره جزئیات نسخه بندی ماژولها در Go در مستندات Go مطالعه کنید.
از اینکه با پارمین کلود همراهید، متشکریم.






نظرات کاربران