این آموزش شما را با مفاهیم پایه فضاهای کاری چندماژولی (Workspaces) در گو آشنا میکند. با استفاده از این ویژگی، میتوانید به دستور Go بپذیرید که بهطور همزمان در حال توسعه کدهایتان روی چند ماژول مختلف هستید و بهسادگی کدهای موجود در آن ماژولها را ساخته (Build) و اجرا کنید.
در این آموزش شما دو ماژول را در یک فضای کاری مشترک ایجاد کرده، تغییراتی را میان آنها اعمال نموده و نتیجه را در خروجی ساخت برنامه مشاهده خواهید کرد.
💡 نکته: برای مشاهده سایر آموزشها، بخش آموزشها (Tutorials) را در وبسایت رسمی گو ببینید.
پیشنیازها
-
گو (Go): برای دنبال کردن این آموزش پیشنهاد میشود از آخرین نسخه گو استفاده کنید. جهت مطالعه دستورالعملهای نصب، بخش نصب گو (Installing Go) را ببینید.
-
ابزاری برای ویرایش کد: هر ویرایشگر متنی به خوبی کار خواهد کرد.
-
ترمینال خط فرمان: گو روی تمامی ترمینالهای لینوکس، مک و همچنین PowerShell یا cmd در ویندوز به خوبی اجرا میشود.
ساخت یک ماژول برای کد خود
برای شروع، یک ماژول برای کدهایی که خواهید نوشت ایجاد کنید.
۱. یک خط فرمان باز کرده و به دایرکتوری home بروید.
-
در لینوکس یا مک:
cd -
در ویندوز:
cd %HOMEPATH%
💡 نکته: در ادامه آموزش از کاراکتر
$به عنوان نشانگر خط فرمان (Prompt) استفاده شده است. دستورات رو ارائه شده روی ویندوز نیز به همان شکل قابل اجرا هستند.
۲. در خط فرمان، یک دایرکتوری به نام workspace برای کدهای خود ایجاد کنید:
mkdir workspace
cd workspace
مقداردهی اولیه ماژول
در این مثال، یک ماژول جدید به نام hello میسازیم که به ماژول golang.org/x/example وابسته است.
۳. ماژول hello را ایجاد کنید:
mkdir hello
cd hello
go mod init example.com/hello
خروجی دستور:
go: creating new go.mod: module example.com/hello
۴. با استفاده از دستور go get وابسته بودن به پکیج golang.org/x/example/hello/reverse را اضافه کنید:
go get golang.org/x/example/hello/reverse
۵. فایلی به نام hello.go در دایرکتوری hello با محتوای زیر ایجاد کنید:
package main
import (
"fmt"
"golang.org/x/example/hello/reverse"
)
func main() {
fmt.Println(reverse.String("Hello"))
}
۶. اکنون برنامه hello را اجرا کنید:
go run .
خروجی:
olleH
ساخت فضای کاری (Workspace)
در این مرحله، فایلی به نام go.work ایجاد میکنیم تا فضای کاری را مشخص کرده و ماژول را در آن تنظیم کنیم.
مقداردهی اولیه فضای کاری
۱. در دایرکتوری workspace دستور زیر را اجرا کنید:
go work init ./hello
دستور go work init به گو میگوید که یک فایل go.work برای فضای کاری شامل ماژولهای موجود در دایرکتوری hello/. ایجاد کند.
دستور go یک فایل go.work میسازد که به این شکل خواهد بود:
go 1.18
use ./hello
فایل go.work سینتکسی مشابه با go.mod دارد:
-
دستورالعمل
go: به گو میگوید که فایل باید با چه نسخهای از گو تفسیر شود (مشابه دستورgoدر فایلgo.mod). -
دستورالعمل
use: به گو اعلام میکند که ماژول موجود در دایرکتوریhelloباید هنگام فرایند ساخت (Build) به عنوان ماژول اصلی (Main module) در نظر گرفته شود.
بنابراین در هر دایرکتوری فرعی از workspace این ماژول فعال خواهد بود.
اجرای برنامه در دایرکتوری Workspace
۲. در دایرکتوری workspace دستور زیر را اجرا کنید:
go run ./hello
خروجی:
olleH
دستور Go تمام ماژولهای موجود در فضای کاری را به عنوان ماژولهای اصلی در نظر میگیرد. این قابلیت به ما اجازه میدهد حتی خارج از دایرکتوری ماژول، به پکیجهای آن ارجاع دهیم. اگر دستور go run را خارج از ماژول یا فضای کاری اجرا میکردید با خطا مواجه میشدید، زیرا گو نمیدانست از کدام ماژول استفاده کند.
در مرحله بعد، یک کپی محلی از ماژول golang.org/x/example/hello را به فضای کاری اضافه میکنیم. این ماژول در یک دایرکتوری فرعی از مخزن گیت [go.googlesource.com/example](https://go.googlesource.com/example) قرار دارد. سپس تابع جدیدی به پکیج reverse اضافه خواهیم کرد تا به جای String از آن استفاده کنیم.
دانلود و تغییر ماژول golang.org/x/example/hello
در این مرحله، یک کپی از مخزن گیت شامل ماژول golang.org/x/example/hello را دانلود کرده، آن را به فضای کاری اضافه میکنیم و سپس تابع جدیدی به آن اضافه خواهیم کرد که در برنامه hello از آن استفاده کنیم.
کلون کردن مخزن (Clone repository)
۱. از دایرکتوری workspace، دستور git را برای کلون کردن مخزن اجرا کنید:
git clone https://go.googlesource.com/example
خروجی:
Cloning into 'example'...
remote: Total 165 (delta 27), reused 165 (delta 27)
Receiving objects: 100% (165/165), 434.18 KiB | 1022.00 KiB/s, done.
Resolving deltas: 100% (27/27), done.
افزودن ماژول به فضای کاری
مخزن گیت در مسیر example/. دریافت شد. سورسکد ماژول golang.org/x/example/hello در مسیر example/hello/. قرار دارد. آن را به فضای کاری اضافه کنید:
go work use ./example/hello
دستور go work use ماژول جدیدی را به فایل go.work اضافه میکند. فایل شما اکنون به این شکل خواهد بود:
go 1.18
use (
./hello
./example/hello
)
اکنون فضای کاری شامل هر دو ماژول [example.com/hello](https://example.com/hello) و golang.org/x/example/hello است (که پکیج golang.org/x/example/hello/reverse را ارائه میدهد).
این کار به ما اجازه میدهد از کدهای جدیدی که در کپی محلی خود از پکیج reverse مینویسیم استفاده کنیم، به جای اینکه از نسخه کششده ماژول (که قبلاً با دستور go get دانلود شده بود) استفاده شود.
افزودن تابع جدید
ما یک تابع جدید برای معکوس کردن اعداد به پکیج golang.org/x/example/hello/reverse اضافه خواهیم کرد.
۲. فایل جدیدی به نام int.go در دایرکتوری workspace/example/hello/reverse با محتوای زیر ایجاد کنید:
package reverse
import "strconv"
// Int returns the decimal reversal of the integer i.
func Int(i int) int {
i, _ = strconv.Atoi(String(strconv.Itoa(i)))
return i
}
تغییر برنامه hello برای استفاده از تابع جدید
۳. محتوای فایل workspace/hello/hello.go را ویرایش کرده و کد زیر را در آن قرار دهید:
package main
import (
"fmt"
"golang.org/x/example/hello/reverse"
)
func main() {
fmt.Println(reverse.String("Hello"), reverse.Int(24601))
}
اجرای کد در فضای کاری (Workspace)
از دایرکتوری workspace دستور زیر را اجرا کنید:
go run ./hello
خروجی:
olleH 10642
دستور Go ماژول [example.com/hello](https://example.com/hello) را که در خط فرمان مشخص شده است، در دایرکتوری hello (که توسط فایل go.work تعریف شده) پیدا کرده و به همین ترتیب Import مربوط به golang.org/x/example/hello/reverse را با استفاده از فایل go.work حلوفصل (Resolve) میکند.
فایل go.work میتواند به جای استفاده از دستورالعملهای replace برای کار در چندین ماژول استفاده شود.
از آنجایی که هر دو ماژول در یک فضای کاری قرار دارند، اعمال تغییرات در یک ماژول و استفاده از آن در ماژول دیگر بسیار آسان است.
قدم بعدی برای انتشار (Release)
اکنون برای انتشار درست این ماژولها، باید نسخه جدیدی از ماژول golang.org/x/example/hello بفرستیم (مثلاً نسخه v0.1.0). این کار معمولاً با تگ زدن یک کامیت روی مخزن کنترل نسخه ماژول انجام میشود. پس از انجام انتشار، میتوانیم نیازمندی به ماژول golang.org/x/example/hello را در hello/go.mod ارتقا دهیم:
cd hello
go get golang.org/x/example/hello@v0.1.0
به این ترتیب، دستور go میتواند ماژولها را بهدرستی خارج از فضای کاری نیز شناسایی و حلوفصل کند.
اطلاعات بیشتر درباره فضاهای کاری (Workspaces)
دستور go علاوه بر go work init چند زیردستور دیگر برای کار با فضاهای کاری ارائه میدهد:
-
go work use [-r] [dir]: یک دستورالعملuseبرای دایرکتوریdirبه فایلgo.workاضافه میکند (در صورت وجود) و اگر آن دایرکتوری وجود نداشته باشد، آن را حذف میکند. پرچمr-دایرکتوریهای فرعیdirرا به صورت بازگشتی (Recursive) بررسی میکند. -
go work edit: فایلgo.workرا ویرایش میکند (عملکردی مشابهgo mod edit). -
go work sync: وابستگیها را از لیست ساخت فضای کاری با هر یک از ماژولهای داخل فضای کاری همگامسازی (Sync) میکند.
برای جزئیات بیشتر درباره فضاهای کاری و فایلهای go.work به مستندات مرجع ماژولهای گو (Go Modules Reference) مراجعه کنید.
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: منبع مستندات