Giá trị của GOPATH và GOROOT phải là gì?


323

Tôi đang cố gắng cài đặt doozer như thế này:

$ goinstall github.com/ha/doozer

Tôi nhận được những lỗi này.

goinstall: os: go/build: package could not be found locally
goinstall: fmt: go/build: package could not be found locally
goinstall: io: go/build: package could not be found locally
goinstall: reflect: go/build: package could not be found locally
goinstall: math: go/build: package could not be found locally
goinstall: rand: go/build: package could not be found locally
goinstall: url: go/build: package could not be found locally
goinstall: net: go/build: package could not be found locally
goinstall: sync: go/build: package could not be found locally
goinstall: runtime: go/build: package could not be found locally
goinstall: strings: go/build: package could not be found locally
goinstall: sort: go/build: package could not be found locally
goinstall: strconv: go/build: package could not be found locally
goinstall: bytes: go/build: package could not be found locally
goinstall: log: go/build: package could not be found locally
goinstall: encoding/binary: go/build: package could not be found locally

3
@Motin liên kết trên không còn hiệu lực
Jorrit Reedijk 9/11/2015

Các tập tin đã trở nên lỗi thời cho dự án. Một vấn đề liên quan liên quan đến OSX được tìm thấy ở đây: github.com/go-lang-plugin-org/go-lang-idea-plugin/issues/841
Motin

Lưu ý: theo mặc định, GOPATHsẽ được đặt cho bạn trong Go 1.8 (2017). Xem câu trả lời của tôi dưới đây
VonC

Vâng, tôi cũng thấy những điều khó hiểu này, cách thức tổ chức các vị thần. Điều này đã giúp: albertech.blogspot.com/2017/01/ khăn
jar

1
@BenyaminJafari vì goinstallthực sự là tiền cổ xưa và đã không tồn tại từ năm 2012.
Dave C

Câu trả lời:


310

GOPATHđược thảo luận trong cmd/gotài liệu :

Biến GOPATHmôi trường liệt kê các địa điểm để tìm mã Go. Trên Unix, giá trị là một chuỗi phân tách bằng dấu hai chấm. Trên Windows, giá trị là một chuỗi được phân tách bằng dấu chấm phẩy. Trên Kế hoạch 9, giá trị là một danh sách.

GOPATH phải được đặt để nhận, xây dựng và cài đặt các gói bên ngoài cây Go tiêu chuẩn.

GOROOTđược thảo luận trong hướng dẫn cài đặt :

Các bản phân phối nhị phân Go cho rằng chúng sẽ được cài đặt trong /usr/local/go(hoặc c:\Gotrong Windows), nhưng có thể cài đặt các công cụ Go đến một vị trí khác. Trong trường hợp này, bạn phải đặt GOROOTbiến môi trường để trỏ đến thư mục được cài đặt.

Ví dụ: nếu bạn đã cài đặt Chuyển đến thư mục chính của bạn, bạn nên thêm các lệnh sau vào $HOME/.profile:

export GOROOT=$HOME/go
export PATH=$PATH:$GOROOT/bin

Lưu ý: chỉ GOROOT được đặt khi cài đặt vào vị trí tùy chỉnh.

(phiên bản cập nhật của câu trả lời của Chris Bunch .)


44
Thông tin toàn diện hơn nhiều về GOPATH là tại Cách viết mã Go. Nắm bắt thông tin cần có để hiểu golệnh, điều cần thiết để làm việc với Go. Ví dụ, việc sử dụng goinstalltrong OP bây giờ sẽ là go get.
Sonia

13
Cũng lưu ý đường dẫn cài đặt thực tế của đi. Ví dụ: trong thiết lập homebrew mặc định, homebrew sẽ cài đặt đi vào /usr/local/Cellar/go/. Trong trường hợp này, đường dẫn xuất nên được đặt bằng export GOROOT=/usr/local/Cellar/go/{version}export PATH=$PATH:$GOROOT/bin.
ekillaby

10
Tôi đã phải làm export GOROOT=/usr/local/Cellar/go/1.2/libexec/để có được của tôi làm việc với bia.
Steven Soroka

Tôi không thể đề xuất chỉnh sửa này vì ứng dụng phàn nàn rằng bản chỉnh sửa của tôi dường như có chứa mã chưa được định dạng (mà nó không có, cảm ơn rất nhiều SO) nhưng:
Wildcard

Bắt đầu trong Go 1.10, nếu GOROOT không được đặt, công cụ go sẽ cố gắng tìm ra nó theo vị trí của chính nó. Tôi cũng không thể dán liên kết vì dán không hoạt động trong ứng dụng iOS của Stack Exchange. Rất thất vọng ngay bây giờ.
tự đại diện

97

Đây là một thiết lập đơn giản của tôi:

directory for go related things: ~/programming/go
directory for go compiler/tools: ~/programming/go/go-1.4
directory for go software      : ~/programming/go/packages

GOROOT, GOPATH, PATH được thiết lập như sau:

export GOROOT=/home/user/programming/go/go-1.4
export GOPATH=/home/user/programming/go/packages
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

Vì vậy, trong ngắn hạn:

GOROOT dành cho trình biên dịch / công cụ xuất phát từ cài đặt đi.
GOPATH dành cho các dự án đi của riêng bạn / thư viện của bên thứ 3 (được tải xuống với "go get").


Tôi nghĩ câu trả lời này dễ hiểu hơn vì có một ánh xạ đối với cấu trúc thư mục.
h-rai

GOPATH có bao gồm toàn bộ cây dự án (ví dụ git) với các tệp không di chuyển - ví dụ: hình ảnh, tập lệnh, tệp xây dựng, v.v.?
Serge Merzliakov

52

Lần chạy đầu tiên go env.
Nếu bạn thấy rằng go không được cài đặt, bạn có thể cài đặt nó thông qua homebrewhoặc thông qua gói và / hoặc các cách khác.
Nếu bạn đang thấy đầu ra thì Gocài đặt của bạn .
Nó cho bạn thấy tất cả các env được thiết lập và không.

Nếu bạn thấy trống rỗng cho GOROOT:

  1. Chạy which go(Trên máy tính của tôi /usr/local/go/bin/go:)
  2. sau đó xuất khẩu như thế này export GOROOT=/usr/local/go

Nếu bạn thấy trống rỗng cho GOPATH:

  1. Tạo bất kỳ thư mục bất cứ nơi nào trên máy tính của bạn để thực hiện các dự án trong trường hợp của tôi: ~/GO_PROJECTS
  2. Sau đó export GOPATH=~/GO_PROJECTS

2
which gođã làm điều đó cho tôi. Nó đang sử dụng một vị trí cài đặt khác từ cài đặt trước đó bằng Chocolatey. Đã xóa thư mục đó và xóa nó khỏi biến PATH. Bây giờ nó hoạt động. Cảm ơn!
sgarg

which golệnh không hoạt động với tôi trong Windows 7. Làm cách nào để tìm lệnh tôi nên chạy lệnh này
Firstpostcommenter

Lệnh windows tương ứng là where gonó sẽ hiển thị cho bạn đường dẫn của tệp được thực thi
Falco

export GOPATH=~/GO_PROJECTSđã làm việc
Thamaraiselvam

39

GOPATHđược thảo luận ở đây :

Các GOPATHbiến môi trường

GOPATH có thể được đặt thành một danh sách các đường dẫn được phân tách bằng dấu hai chấm trong đó mã Go, các đối tượng gói và các tệp thực thi có thể được tìm thấy.

Đặt a GOPATHđể sử dụng goinstall để xây dựng và cài đặt mã của riêng bạn và các thư viện bên ngoài bên ngoài cây Go (và để tránh viết Makefiles).

GOROOTđược thảo luận ở đây :

$GOROOTRễ cây Go thường xuyên $HOME/go. Điều này mặc định cho cha mẹ của thư mục all.bashđược chạy. Nếu bạn chọn không đặt $GOROOT, bạn phải chạy gomake thay vì make hoặc gmake khi phát triển các chương trình Go bằng cách sử dụng các tệp tạo tệp thông thường.


Vì vậy, nếu tôi đã cài đặt tại ~ / dự án / đi, các giá trị của biến là gì để tìm os, fmt, v.v.?
jshen

2
Vậy Go đi đâu khi bạn cài đặt sudo apt-get install golang?
weberc2

9
@ weberc2 nếu bạn chạy, go envbạn sẽ thấy thông tin đó, đối với tôi đó là/usr/lib/go/
Andre

19

Tôi đã đọc các go help gopathtài liệu và vẫn còn bối rối vô cùng, nhưng tìm thấy cái nugget nhỏ này từ một trang tài liệu khác:

Biến môi trường GOPATH chỉ định vị trí của không gian làm việc của bạn. Đây có thể là biến môi trường duy nhất bạn cần đặt khi phát triển mã Go.

http://golang.org/doc/code.html#GOPATH


10

GOPATH không nên trỏ đến cài đặt Go mà thay vào đó là không gian làm việc của bạn (xem https://golang.org/doc/code.html#GOPATH ). Bất cứ khi nào bạn cài đặt một số gói với go get hoặc go install, nó sẽ hạ cánh trong GOPATH. Đó là lý do tại sao nó cảnh báo bạn, rằng bạn chắc chắn không muốn các gói ngẫu nhiên từ internet bị đổ vào bản cài đặt chính thức của mình.


9

Bắt đầu với go 1.8 (quý 2 năm 2017), GOPATH sẽ được đặt cho bạn theo mặc định là $ HOME / go

Xem vấn đề 17262 và bình luận của Rob Pike:

$HOME/gonó sẽ là.
Không có câu trả lời tốt nhất duy nhất nhưng điều này ngắn gọn và ngọt ngào, và chỉ có thể là vấn đề để chọn tên đó nếu $HOME/gođã tồn tại, điều này sẽ chỉ vui cho các chuyên gia đã cài đặt và sẽ hiểu GOPATH.


Làm thế nào một chủ đề đơn giản trở nên phức tạp như vậy! Cảm ơn câu trả lời tốt nhất ở đây.
dodgy_coder

@dodgy_coder Trên thực tế ... hãy nhìn vào hai dòng đầu tiên của câu trả lời khác của tôi: stackoverflow.com/a/37905102/6309 ;) Điều đó có thể thậm chí còn đơn giản hơn nữa Thêm chi tiết trong stackoverflow.com/a/48914523/6309 .
VonC

vâng tôi đồng ý, GOPATH không thực sự cần thiết nếu bạn đi với mặc định, điều đó có đúng không? Tôi cần phải đặt nó bằng mọi cách do nó được yêu cầu cho môi trường phát triển Google App Engine (Go Standard). Họ thực sự bảo bạn đặt GOPATH, nhưng đừng cho bạn biết giá trị nào để đặt nó thành ..!
dodgy_coder

@dodgy_coder Có, theo mặc định, Go sẽ tìm PATH dự án theo giá trị định trước cố định.
VonC

6

Như đã đề cập ở trên:

Biến môi trường GOPATH chỉ định vị trí của không gian làm việc của bạn.

Đối với Windows , điều này làm việc cho tôi (trong cửa sổ Ms-dos):

set GOPATH=D:\my_folder_for_go_code\

Điều này tạo ra một biến GOPATH mà Ms-dos nhận ra khi được sử dụng như sau:

cd %GOPATH%

3

Về GOROOTcụ thể, Go 1.9 sẽ cài đặt nó tự động để cài đặt đường dẫn của nó.
Ngay cả khi bạn đã cài đặt nhiều Go, việc gọi 1.9.x sẽ được đặt GOROOTthành /path/to/go/1.9(trước đó, nếu không được đặt, nó sẽ giả sử một đường dẫn mặc định như /usr/local/gohoặc c:\Go).

Xem đánh giá CL Go 53370 :

Các go toolbây giờ sẽ sử dụng đường dẫn mà từ đó nó đã được gọi để cố gắng xác định vị trí thư mục gốc của Go cài đặt cây .
Điều này có nghĩa là nếu toàn bộ cài đặt Go được chuyển đến một vị trí mới, thì phần go tooltiếp tục sẽ hoạt động như bình thường.

Điều này có thể được ghi đè bằng cách thiết lập GOROOTtrong môi trường, chỉ nên được thực hiện trong trường hợp bất thường.
Lưu ý rằng điều này không ảnh hưởng đến kết quả của runtime.GOROOT()chức năng , sẽ tiếp tục báo cáo vị trí cài đặt ban đầu; điều này có thể được sửa trong các bản phát hành sau.


0

Kể từ năm 2020 và phiên bản Go 1.13+, trong Windows, cách tốt nhất để cập nhật GOPATH chỉ là gõ vào dấu nhắc lệnh:

setx GOPATH C:\mynewgopath

0

Đây là một giải pháp (người dùng đơn):

GOROOT=$HOME/.local # your go executable is in $GOROOT/bin
GOPATH=$HOME/.gopath
PATH=$GOROOT/bin:$GOPATH/bin:$PATH

gophàn nàn nếu bạn thay đổi .gopaththành.go .

Tôi ước họ đã đi với cách mà các rust/cargochàng trai đã làm và chỉ đặt mọi thứ ở một nơi.


-1

Trong osx, tôi đã cài đặt với brew, đây là cài đặt phù hợp với tôi

GOPATH="$HOME/my_go_work_space" //make sure you have this folder created

GOROOT="/usr/local/Cellar/go/1.10/libexec"

-1

Tôi đã phải nối thêm

export GOROOT=/usr/local/Cellar/go/1.10.1/libexec

tới ~ / .bash_profile của tôi trên Mac OS X


-1

Cũng có trường hợp khi chúng ta sử dụng go, nó sẽ biên dịch tất cả các tệp go.

Vì vậy, giả sử chúng tôi có một tệp main.go và sau đó chúng tôi đã thay đổi tệp hiện tại thành main_old.go và sau đó thêm tệp main.go mới của chúng tôi . Sau đó, khi chúng tôi xây dựng ứng dụng của mình, tất cả các tệp đi sẽ được biên dịch. Vì vậy, lỗi xảy ra có thể là do lỗi biên dịch trong một số tệp đi khác.


-1

Khi Go lang được cài đặt, GOROOT là thư mục gốc của bản cài đặt.

Khi tôi phát nổ nhị phân Go Lang trong thư mục Windows C: \, GOROOT của tôi phải là C: \ go. Nếu được cài đặt bằng trình cài đặt Windows, đó có thể là C: \ Program Files \ go (hoặc C: \ Program Files (x86) \ go, đối với các gói 64 bit)

 GOROOT = C:\go

trong khi GOPATH của tôi là vị trí của mã nguồn Go lang hoặc không gian làm việc.

Nếu mã nguồn Go lang của tôi được đặt tại C: \ Users \\ GO_Workspace, GOPATH của bạn sẽ như sau:

 GOPATH = C:\Users\<xyz>\GO_Workspace

-1

Bạn không cần phải thiết lập rõ ràng GOROOT (Các phiên bản hiện đại của Go có thể tự mình tìm ra nó dựa trên vị trí của nhị phân cờ vây mà bạn chạy).

Ngoài ra, có lỗi theo sau khi cố gắng làm việc với vgo:

go: modules disabled inside GOPATH/src by GO111MODULE=auto; see 'go help modules'

Xóa GOROOT, cập nhật GOPATH của tôi và export GO111MODULE="on" giải quyết vấn đề.

GOPATH xem tại đây

GOPATH có thể được đặt thành một danh sách các đường dẫn được phân tách bằng dấu hai chấm trong đó mã Go, các đối tượng gói và các tệp thực thi có thể được tìm thấy.

Đặt GOPATH để sử dụng goinstall để xây dựng và cài đặt mã của riêng bạn và các thư viện bên ngoài bên ngoài cây Go (và để tránh viết Makefiles).


-2

các giá trị phải là (MACOS):

GOROOT="/usr/local/go" --> all binaries file core go
GOPATH="/Applications/proyectos/go" --> the route to workspace (custom workspace)

-3

Nếu bạn đang sử dụng bản phân phối, bạn nên chỉ đến vị trí của các tệp đính kèm, ví dụ:

$ rpm -ql golang | grep include
/usr/lib/golang/include

(Cái này dành cho Fedora 20)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.