Files
build-web-application-with-…/fa/working/01.2.md
2019-06-17 06:52:04 +09:00

157 lines
9.9 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 1.2 $GOPATH و فضای کاری
## $GOPATH
Go با معرفی دایرکتوری `$GOPATH` روش منحصر به فردی برای مدیریت فایل های حاوی کد دارد. در این مسیر تمام کدهای مرتبط با go در سیستم شما قرار گرفته است. توجه داشته باشید که این دایرکتوری با متغیر محیطی `$GOROOT`، که مشخص می‌کند go در چه مسیری نصب شده است، تفاوت دارد. قبل از اینکه از این زبان برای برنامه‌نویسی استفاده کنیم باید متغیر `$GOPATH` را تعریف کنیم. در سیستم‌های شبه یونیکس (*nix) فایلی به نام `.profile` وجود دارد که باید دستور زیر را به انتهای این فایل اضافه کنیم. مفهوم استفاده از gopath یک مفهوم جدید محسوب می شود که طی آن، هر کد go را می توان در هر زمان و بدون هیچ گونه ابهامی لینک نمود.
در ورژن go 1.8 به بعد، اگر متغیر محیطی GOPATH تنظیم نشود، یک مقدار پیش فرض برای آن در نظر گرفته می شود که در یونیکس مقدار `$HOME/go` و در ویندوز مقدار `%USERPROFILE%/go` را دارد.
در سیستم‌های شبه یونیکسی، این متغیر را می‌توان به صورت زیر مورد استفاده قرار داد:
export GOPATH=${HOME}/mygo
در ویندوز، ابتدا باید یک متغیر محیطی به نام GOPATH ایجاد کنید، که با مقدار `c:\mygo` مقداردهی شده باشد. ( ***این مقدار بستگی به این دارد که فضای کاری شما در کجا قرار گرفته باشد*** )
طبیعتا مشکلی ندارد که در فضای کاری شما، بیشتر از یک مقدار برای `$GOPATH` در نظر گرفته شود، فقط توجه داشته باشید که با استفاده از `:` این مقادیر را از هم مجزا کنید (در ویندوز باید از `;` استفاده کنید). در این حالت، دستور `go get` محتوای اولین مسیر شما را در `$GOPATH` قرار می دهد. معمولا توصیه می‌شود که از نصب ورژن‌های متعدد Go خودداری شود. در برترین حالت ممکن است فولدری با نام پروژه خود در مسیر `$GOPATH` ایجاد کنید، که باعث می‌شود همه چیز به هم بریزد. چون وقتی در مسیر `$GOPATH` پوشه ای ساخته می شود، آن پوشه را به عنوان یک پکیج/بسته می شناسد. بنابراین وقتی از دستور `go get` استفاده می‌کنید، دنبال بسته ای هم نام با فولدر شما می‌گردد و طبیعتا آن را پیدا نمی‌کند. پس لطفا از قراردادهای تعریف شده برای برنامه‌نویسی پیروی کنید چون حتما برای تعریف هر یک از آن ها دلیلی وجود داشته است.
در `$GOPATH`، شما باید سه فولدر به صورت زیر داشته باشید:
- `src` برای سورس فایل‌هایی که پسوند .go، .c، .g، .s دارند.
- `pkg` برای فایل‌های کامپایل شده ای که پسوند .a دارند.
- `bin` برای فایل‌های اجرایی.
در این کتاب، ما از `mygo` به عنوان تنها مقداری که در متغیر `$GOPATH` قرار گرفته استفاده می کنیم.
## دایرکتوری بسته‌ها
برای ایجاد سورس فایل‌ها و فولدرهای خود از مسیری مانند `$GOPATH/src/mymath/sqrt.go` استفاده کنید به طوری که `mymath` در واقع نام بسته شما محسوب می‌شود. ( ***شما ممکن است نام بسته خود را `mymath` بگذارید و در عین حال دقیقا همین نام را برای پوشه یا فایل‌های بسته در نظر بگیرید*** )
هر زمان که بسته ای ایجاد می‌کنید، باید پوشه‌ای در مسیر `src` برای این پکیج در نظر بگیرید، که البته توجه داشته باشید پکیج `main` یک استثناء محسوب می‌شود، چون ساخت پوشه‌ای برای `main` در واقع امری اختیاری است و اجباری ندارد. معمولا نام پوشه‌ها هم‌نام با نام بسته‌ای در نظر گرفته می‌شود که می‌خواهید از آن استفاده کنید. همچنین در صورت لزوم می‌توانید از دایرکتوری‌های چندسطحی استفاده کنید. برای مثال، اگر دایرکتوری `$GOPATH/src/github.com/astaxie/beedb` را ایجاد کرده‌اید، آن‌گاه مسیر بسته‌ی شما به صورت `github.com/astaxie/beedb` خواهد بود. نام بسته درواقع آخرین دایرکتوری در این مسیر می‌باشد که در این مثال `beedb` است.
دستورات زیر را اجرا کنید.
cd $GOPATH/src
mkdir mymath
یک فایل جدید با نام `sqrt.go` ایجاد کرده و متن زیر را در این فایل قرار دهید.
```Go
// Source code of $GOPATH/src/mymath/sqrt.go
package mymath
func Sqrt(x float64) float64 {
z := 0.0
for i := 0; i < 1000; i++ {
z -= (z*z - x) / (2 * x)
}
return z
}
```
بدین ترتیب دایرکتوری بسته‌ی من ایجاد شده و کدهای مرتبط با آن هم بررسی کردیم. توصیه می‌کنیم که از همان نامی که برای بسته استفاده می‌کنید برای دایرکتوری مرتبط با آن استفاده کنید، به طوری که دایرکتوری شما تمام سورس فایل‌های مربوط به آن بسته را در خود دارد.
## کامپایل بسته‌ها
همان‌طور که در بالا عنوان شد، بسته‌ای را ایجاد کردیم. اما سوال اینجاست که چطور این بسته را برای کارهای عملی کامپایل کنیم؟ برای این کار دو روش زیر وجود دارند:
1. به مسیر پکیج رفته و دستور `go install` را اجرا کنید.
2. دستور فوق را به همراه نام فایل اجرا کنید، مثلا `go install mymath`.
بعد از اینکه کامپایل انجام شد، می توان به مسیر زیر رفت و تغییرات را مشاهده کرد.
cd $GOPATH/pkg/${GOOS}_${GOARCH}
// فایل زیر بعد از کامپایل ایجاد شده است
mymath.a
فایل که پسوند `.a` دارد، در واقع همان فایل باینری مربوط به بسته‌ی ما می‌باشد. چطور از این فایل استفاده کنیم؟
به نظر می‌رسد که برای استفاده از این فایل باید یک اپلیکیشن ایجاد کنیم.
برای این کار یک پکیج اپلیکیشن با نام `mathapp` ایجاد کنید.
cd $GOPATH/src
mkdir mathapp
cd mathapp
vim main.go
در فایل main.go دستورات زیر را قرار دهید.
```Go
//$GOPATH/src/mathapp/main.go source code.
package main
import (
"mymath"
"fmt"
)
func main() {
fmt.Printf("Hello, world. Sqrt(2) = %v\n", mymath.Sqrt(2))
}
```
برای کامپایل این برنامه، باید به مسیر این بسته یعنی `$GOPATH/src/mathapp` رفته و دستور `go install` را اجرا کنید. بعد از کامپایل، یک فایل اجرایی با نام `mathapp` در دایرکتوری `$GOPATH/bin/` ایجاد می‌شود. برای اجرای این برنامه، از دستور `./mathapp` استفاده کنید. بعد از اجرای این دستور، عبارت زیر در ترمینال شما نمایش داده می‌شود.
Hello world. Sqrt(2) = 1.414213562373095
## نصب بسته‌های ریموت
Go has a tool for installing remote packages, which is a command called `go get`. It supports most open source communities, including GitHub, Google Code, BitBucket, and Launchpad.
go get github.com/astaxie/beedb
You can use `go get -u …` to update your remote packages and it will automatically install all the dependent packages as well.
This tool will use different version control tools for different open source platforms. For example, `git` for GitHub and `hg` for Google Code. Therefore, you have to install these version control tools before you use `go get`.
After executing the above commands, the directory structure should look like following.
$GOPATH
src
|-github.com
|-astaxie
|-beedb
pkg
|--${GOOS}_${GOARCH}
|-github.com
|-astaxie
|-beedb.a
Actually, `go get` clones source code to the `$GOPATH/src` of the local file system, then executes `go install`.
You can use remote packages in the same way that we use local packages.
```Go
import "github.com/astaxie/beedb"
```
## ساختار کامل دایرکتوری
If you've followed all of the above steps, your directory structure should now look like the following.
bin/
mathapp
pkg/
${GOOS}_${GOARCH}, such as darwin_amd64, linux_amd64
mymath.a
github.com/
astaxie/
beedb.a
src/
mathapp
main.go
mymath/
sqrt.go
github.com/
astaxie/
beedb/
beedb.go
util.go
Now you are able to see the directory structure clearly; `bin` contains executable files, `pkg` contains compiled files and `src` contains package source files.
(The format of environment variables in Windows is `%GOPATH%`, however this book mainly follows the Unix-style, so Windows users need to replace these yourself.)
## لینک‌ها
- [فهرست مطالب](preface.md)
- بخش قبلی: [نصب](01.1.md)
- بخش بعدی: [دستورات Go](01.3.md)