2012-11-03 43 views
59

Mặc dù tôi đã thiết lập đúng GOPATH, tôi vẫn không thể "đi xây dựng" hoặc "chạy" để tìm gói của riêng mình. Tôi đang làm gì sai? Cảm ơn bạn rất nhiều!Đi xây dựng: "Không thể tìm thấy gói" (mặc dù GOPATH được đặt)

$ echo $GOROOT 
/usr/local/go 

$ echo $GOPATH 
/home/mitchell/go 

$ cat ~/main.go 
package main 
import "foobar" 
func main() { } 

$ cat /home/mitchell/go/src/foobar.go 
package foobar 

$ go build main.go 
main.go:3:8: import "foobar": cannot find package 
+0

Tôi gặp phải vấn đề tương tự khi tôi truy cập https://github.com/adonovan/gopl.io/tree/master/ch1/helloworld Lý do sẽ không có tệp helloworld.go. hoạt động bằng cách khớp tên gói và tên tệp. –

Trả lời

78

Nó không làm việc vì foobar.go tệp nguồn của bạn không phải là trong một thư mục gọi là foobar. go buildgo install cố gắng khớp các thư mục, chứ không phải tệp nguồn.

  1. Đặt $GOPATH vào thư mục hợp lệ, ví dụ: export GOPATH="$HOME/go"
  2. Di chuyển foobar.go đến $GOPATH/src/foobar/foobar.go và tòa nhà sẽ hoạt động tốt.

bước đề nghị bổ sung:

  1. Thêm $GOPATH/bin-$PATH của bạn bằng cách: PATH="$GOPATH/bin:$PATH"
  2. Move main.go đến một thư mục con của $GOPATH/src, ví dụ $GOPATH/src/test
  3. go install test giờ đây sẽ tạo tệp thực thi trong $GOPATH/bin có thể được gọi bằng cách nhập test vào thiết bị đầu cuối của bạn.
+0

Đây có phải là lỗi không? My 'GOPATH =/usr/local/go-pkgs', do đó, Go tìm trong'/usr/local/go-pkgs/src/ 'cho nguồn, nhưng' go get' đặt nó vào trong '/ usr/local/go-pkgs/src/gopkg.in/ '. Tại sao tôi phải tự di chuyển tất cả các gói của mình sau khi cài đặt? Đó chỉ là ngớ ngẩn. – josiah

+1

'go get' thường đặt các gói vào' $ GOPATH/src/'vì vậy nếu bạn gọi' go get domain.com/path/to/package', nó sẽ kết thúc bằng '$ GOPATH/src/domain.com/path/đến/gói'. Tôi đoán bạn cố gắng lấy một gói từ 'gopkg.in'? Nếu như vậy thats absolutly dự định hành vi và bạn chỉ nên nhập khẩu chúng với tên đầy đủ của họ; ví dụ. 'import" gopkg.in/yaml.v1 "' cũng như [được mô tả trong tài liệu] (https://gopkg.in/yaml.v1). – fasmat

+0

Ahhhh, tôi hiểu rồi. Cảm ơn vì đã xua tan sự thiếu hiểu biết của tôi. – josiah

6

Chỉnh sửa: kể từ khi bạn có nghĩa là GOPATH, xem fasmat 's answer (upvoted)

Như đã đề cập trong "How do I make go find my package?", bạn cần phải đặt một gói xxx trong một thư mục xxx.

Xem Go language spec:

package math 

Một tập hợp các tập tin chia sẻ cùng một hình thức PackageName thi hành một gói.
Việc triển khai có thể yêu cầu tất cả các tệp nguồn cho một gói nằm trong cùng một thư mục.

Các Code organization đề cập:

Khi xây dựng một chương trình import gói "widget" lệnh go tìm kiếm src/pkg/widget bên trong thư mục gốc Go, và lúc bấy giờ nếu nguồn gói không được tìm thấy ở đó —các tìm kiếm cho src/widget bên trong mỗi không gian làm việc theo thứ tự.

(một "không gian làm việc" là một mục đường dẫn trong của bạn GOPATH: biến mà có thể tham khảo nhiều đường cho chiến dịch 'src, bin, pkg' to be)


(câu trả lời gốc)

Bạn cũng có nên đặt GOPATH thành ~/go, không phải GOROOT, như được minh họa trong "How to Write Go Code".

Đường dẫn đi được sử dụng để giải quyết các câu lệnh nhập. Nó được thực hiện bởi và được ghi lại trong gói go/build.

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

Đó là khác biệt so với GOROOT:

Các bản phân phối nhị phân Go cho rằng họ sẽ được cài đặt trong /usr/local/go (hoặc c:\Go trong môi trường Windows), nhưng nó có thể cài đặt chúng ở một vị trí khác nhau.
Nếu bạn làm điều này, bạn sẽ cần phải đặt biến môi trường GOROOT vào thư mục đó khi sử dụng công cụ Tìm.

+3

Ngoài ra còn có [đoạn giới thiệu video ngắn] (https://www.youtube.com/watch?feature=player_embedded&v=XCsL89YtqCs&noredirect=1) để thiết lập GOPATH –

+0

Xin lỗi, tôi đã chỉnh sửa câu hỏi gốc. Ở khắp mọi nơi tôi nói GOROOT I * có nghĩa là * GOPATH. – MitchellSalad

-2

Bạn đã thử thêm thư mục tuyệt đối của vào vào 'đường dẫn' của bạn?

export PATH=$PATH:/directory/to/go/ 
0

TL; DR: Làm theo quy ước Go! (bài học kinh nghiệm theo cách khó), kiểm tra các phiên bản cũ và remove chúng. Cài đặt mới nhất.

Đối với tôi giải pháp là khác nhau. Tôi đã làm việc trên một máy chủ Linux được chia sẻ và sau khi xác minh GOPATH và các biến môi trường khác nhiều lần, nó vẫn không hoạt động. Tôi gặp phải một số lỗi bao gồm 'Không thể tìm thấy gói' và 'đường dẫn nhập không được công nhận'. Sau khi thử cài đặt lại với giải pháp this theo hướng dẫn trên golang.org (bao gồm cả uninstall phần) vẫn gặp sự cố.

Đã cho tôi một thời gian để nhận ra rằng vẫn còn một phiên bản cũ chưa được gỡ cài đặt (chạy go version sau đó which go một lần nữa ... DAHH) đã đưa tôi đến this câu hỏi và cuối cùng được giải quyết.

Các vấn đề liên quan