01.2.md 9.7 KB
Newer Older
M
Maryam Behzadi 已提交
1
# 1.2 $GOPATH و فضای کاری
M
Maryam Behzadi 已提交
2 3 4

## $GOPATH

M
Maryam Behzadi 已提交
5
Go با معرفی دایرکتوری `$GOPATH` روش منحصر به فردی برای مدیریت فایل های حاوی کد دارد. در این مسیر تمام کدهای مرتبط با go در سیستم شما قرار گرفته است. توجه داشته باشید که این دایرکتوری با متغیر محیطی `$GOROOT`، که مشخص می‌کند go در چه مسیری نصب شده است، تفاوت دارد. قبل از اینکه از این زبان برای برنامه‌نویسی استفاده کنیم باید متغیر `$GOPATH` را تعریف کنیم. در سیستم‌های شبه یونیکس (*nix) فایلی به نام ‍‍`.profile` وجود دارد که باید دستور زیر را به انتهای این فایل اضافه کنیم. مفهوم استفاده از gopath یک مفهوم جدید محسوب می شود که طی آن، هر کد go را می توان در هر زمان و بدون هیچ گونه ابهامی لینک نمود.
M
Maryam Behzadi 已提交
6

M
Maryam Behzadi 已提交
7
در ورژن go 1.8 به بعد، اگر متغیر محیطی GOPATH تنظیم نشود، یک مقدار پیش فرض برای آن در نظر گرفته می شود که در یونیکس مقدار `$HOME/go` و در ویندوز مقدار `%USERPROFILE%/go` را دارد. 
M
Maryam Behzadi 已提交
8

M
Maryam Behzadi 已提交
9
در سیستم‌های شبه یونیکسی، این متغیر را می‌توان به صورت زیر مورد استفاده قرار داد:
M
Maryam Behzadi 已提交
10 11
	export GOPATH=${HOME}/mygo
	
M
Maryam Behzadi 已提交
12
در ویندوز، ابتدا باید یک متغیر محیطی به نام GOPATH ایجاد کنید، که با مقدار `c:\mygo` مقداردهی شده باشد. ( ***این مقدار بستگی به این دارد که فضای کاری شما در کجا قرار گرفته باشد*** )
M
Maryam Behzadi 已提交
13

M
Maryam Behzadi 已提交
14
طبیعتا مشکلی ندارد که در فضای کاری شما، بیشتر از یک مقدار برای `$GOPATH` در نظر گرفته شود، فقط توجه داشته باشید که با استفاده از `:` این مقادیر را از هم مجزا کنید (در ویندوز باید از `;` استفاده کنید). در این حالت، دستور `go get` محتوای اولین مسیر شما را در `$GOPATH` قرار می دهد. معمولا توصیه می‌شود که از نصب ورژن‌های متعدد Go خودداری شود. در برترین حالت ممکن است فولدری با نام پروژه خود در مسیر `$GOPATH` ایجاد کنید، که باعث می‌شود همه چیز به هم بریزد. چون وقتی در مسیر `$GOPATH` پوشه ای ساخته می شود، آن پوشه را به عنوان یک پکیج/بسته می شناسد. بنابراین وقتی از دستور `go get` استفاده می‌کنید، دنبال بسته ای هم نام با فولدر شما می‌گردد و طبیعتا آن را پیدا نمی‌کند. پس لطفا از قراردادهای تعریف شده برای برنامه‌نویسی پیروی کنید چون حتما برای تعریف هر یک از آن ها دلیلی وجود داشته است.
M
Maryam Behzadi 已提交
15

M
Maryam Behzadi 已提交
16
در `$GOPATH`، شما باید سه فولدر به صورت زیر داشته باشید:
M
Maryam Behzadi 已提交
17

M
Maryam Behzadi 已提交
18 19 20
- `src` برای سورس فایل‌هایی که پسوند .go، .c، .g، .s دارند.
- `pkg` برای فایل‌های کامپایل شده ای که پسوند .a دارند.
- `bin` برای فایل‌های اجرایی.
M
Maryam Behzadi 已提交
21

M
Maryam Behzadi 已提交
22
در این کتاب، ما از `mygo` به عنوان تنها مقداری که در متغیر `$GOPATH` قرار گرفته استفاده می کنیم.
M
Maryam Behzadi 已提交
23

M
Maryam Behzadi 已提交
24
## دایرکتوری بسته‌ها
M
Maryam Behzadi 已提交
25

M
Maryam Behzadi 已提交
26
برای ایجاد سورس فایل‌ها و فولدرهای خود از مسیری مانند `$GOPATH/src/mymath/sqrt.go` استفاده کنید به طوری که `mymath` در واقع نام بسته شما محسوب می‌شود. ( ***شما ممکن است نام بسته خود را `mymath` بگذارید و در عین حال دقیقا همین نام را برای پوشه یا فایل‌های بسته در نظر بگیرید*** )
M
Maryam Behzadi 已提交
27

M
Maryam Behzadi 已提交
28
هر زمان که بسته ای ایجاد می‌کنید، باید پوشه‌ای در مسیر `src` برای این پکیج در نظر بگیرید، که البته توجه داشته باشید پکیج `main` یک استثناء محسوب می‌شود، چون ساخت پوشه‌ای برای `main` در واقع امری اختیاری است و اجباری ندارد. معمولا نام پوشه‌ها هم‌نام با نام بسته‌ای در نظر گرفته می‌شود که می‌خواهید از آن استفاده کنید. همچنین در صورت لزوم می‌توانید از دایرکتوری‌های چندسطحی استفاده کنید. برای مثال، اگر دایرکتوری `$GOPATH/src/github.com/astaxie/beedb` را ایجاد کرده‌اید، آن‌گاه مسیر بسته‌ی شما به صورت `github.com/astaxie/beedb` خواهد بود. نام بسته درواقع آخرین دایرکتوری در این مسیر می‌باشد که در این مثال `beedb` است.
M
Maryam Behzadi 已提交
29

M
Maryam Behzadi 已提交
30
دستورات زیر را اجرا کنید.
M
Maryam Behzadi 已提交
31 32 33
	cd $GOPATH/src
	mkdir mymath
	
M
Maryam Behzadi 已提交
34 35
یک فایل جدید با نام `sqrt.go` ایجاد کرده و متن زیر را در این فایل قرار دهید.

M
Maryam Behzadi 已提交
36 37 38 39 40 41 42 43 44 45 46 47
```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
}
```	
M
Maryam Behzadi 已提交
48
بدین ترتیب دایرکتوری بسته‌ی من ایجاد شده و کدهای مرتبط با آن هم بررسی کردیم. توصیه می‌کنیم که از همان نامی که برای بسته استفاده می‌کنید برای دایرکتوری مرتبط با آن استفاده کنید، به طوری که دایرکتوری شما تمام سورس فایل‌های مربوط به آن بسته را در خود دارد.
M
Maryam Behzadi 已提交
49

M
Maryam Behzadi 已提交
50
## کامپایل بسته‌ها
M
Maryam Behzadi 已提交
51

M
Maryam Behzadi 已提交
52
همان‌طور که در بالا عنوان شد، بسته‌ای را ایجاد کردیم. اما سوال اینجاست که چطور این بسته را برای کارهای عملی کامپایل کنیم؟ برای این کار دو روش زیر وجود دارند:
M
Maryam Behzadi 已提交
53

M
Maryam Behzadi 已提交
54 55
1. به مسیر پکیج رفته و دستور `go install` را اجرا کنید.
2. دستور فوق را به همراه نام فایل اجرا کنید، مثلا `go install mymath`.
M
Maryam Behzadi 已提交
56

M
Maryam Behzadi 已提交
57
بعد از اینکه کامپایل انجام شد، می توان به مسیر زیر رفت و تغییرات را مشاهده کرد.
M
Maryam Behzadi 已提交
58
	cd $GOPATH/pkg/${GOOS}_${GOARCH}
M
Maryam Behzadi 已提交
59
	// فایل زیر بعد از کامپایل ایجاد شده است
M
Maryam Behzadi 已提交
60 61
	mymath.a
	
M
Maryam Behzadi 已提交
62 63 64
فایل که پسوند `.a` دارد، در واقع همان فایل باینری مربوط به بسته‌ی ما می‌باشد. چطور از این فایل استفاده کنیم؟

به نظر می‌رسد که برای استفاده از این فایل باید یک اپلیکیشن ایجاد کنیم.
M
Maryam Behzadi 已提交
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94


Create a new application package called `mathapp`.

	cd $GOPATH/src
	mkdir mathapp
	cd mathapp
	vim main.go
	
Write the following content to 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))
}
```

To compile this application, you need to switch to the application directory, which in this case is `$GOPATH/src/mathapp`, then execute the `go install` command. Now you should see an executable file called `mathapp` was generated in the directory `$GOPATH/bin/`. To run this program, use the `./mathapp` command. You should see the following content in your terminal. 

	Hello world. Sqrt(2) = 1.414213562373095
	
M
Maryam Behzadi 已提交
95
## نصب بسته‌های ریموت
M
Maryam Behzadi 已提交
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123

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"
```
M
Maryam Behzadi 已提交
124
## ساختار کامل دایرکتوری
M
Maryam Behzadi 已提交
125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150

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.)

M
Maryam Behzadi 已提交
151
## لینک‌ها
M
Maryam Behzadi 已提交
152

M
Maryam Behzadi 已提交
153 154 155
- [فهرست مطالب](preface.md)
- بخش قبلی: [نصب](01.1.md)
- بخش بعدی: [دستورات Go](01.3.md)