Câu hỏi Xây dựng: “Không thể tìm thấy gói” (mặc dù GOPATH được đặt)


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

$ 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

76
2017-11-03 22:15


gốc


Tôi gặp vấn đề tương tự khi tôi đi lấy github.com/adonovan/gopl.io/tree/master/ch1/helloworld  Lý do là nó không có tập tin của tên helloworld.go. đi làm việc bằng cách kết hợp tên gói và tên tệp. - keniee van


Các câu trả lời:


Nó không hoạt động vì foobar.go tệp nguồn không nằm trong thư mục có tên foobar. go build và go install cố gắng khớp các thư mục, chứ không phải tệp nguồn.

  1. Bộ $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à xây dựng nên hoạt động tốt.

Các bước được đề xuất bổ sung:

  1. Thêm vào $GOPATH/bin cho bạn $PATH bởi: PATH="$GOPATH/bin:$PATH"
  2. Di chuyển main.go vào một thư mục con của $GOPATH/src, ví dụ. $GOPATH/src/test
  3. go install test bây giờ sẽ tạo một 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.

102
2017-11-04 22:26



Đây không phải là lỗi à? Của tôi GOPATH=/usr/local/go-pkgs, do đó, Go nhìn vào /usr/local/go-pkgs/src/<package-name> cho nguồn, nhưng go get đặt nó vào /usr/local/go-pkgs/src/gopkg.in/<package-name>. 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
go get thường đặt 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 trong $GOPATH/src/domain.com/path/to/package. 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. - fasmat
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


Chỉnh sửa: vì bạn có nghĩa là GOPATH, hãy xem fasmat'S câu trả lời (upvoted)

Như đã đề cập trong "Làm thế nào để tôi đi tìm gói của tôi?", bạn cần phải đặt một gói xxx trong một thư mục xxx.

Xem Đặc tả ngôn ngữ đi:

package math

Một tập hợp các tệp chia sẻ giống nhau PackageName hình thành việc thực hiện 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 Tổ chức mã đề cập:

Khi xây dựng chương trình nhập gói "widget" các go lệnh tìm kiếm src/pkg/widget bên trong thư mục Go root và sau đó - nếu không tìm thấy nguồn gói ở đó, nó sẽ tìm kiếm src/widget bên trong mỗi không gian làm việc theo thứ tự.

("không gian làm việc" là mục nhập đường dẫn trong GOPATH: biến đó có thể tham chiếu nhiều đường dẫn cho 'của bạnsrc, bin, pkg' được)


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

Bạn cũng nên đặt GOPATH đến ~ / đi, không GOROOT, như được minh họa trong "Cách viết mã Go".

Đường dẫn Go đượ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.

Các GOPATH biến môi trường 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 tách bằng dấu chấm phẩy.
  Trong Gói 9, giá trị là một danh sách.

Điều đó khác với GOROOT:

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


7
2017-11-03 22:30



Cũng có một giới thiệu video ngắn để thiết lập GOPATH - Ulf Holm Nielsen
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


TL; DR: Thực hiện theo quy ước Go! (bài học học được một cách khó khăn), kiểm tra các phiên bản cũ và tẩy 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 điều này giải pháp bằng các hướng dẫn trên golang.org (bao gồm cả gỡ cài đặt một phần) vẫn gặp phải vấn đề.

Đã 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 (đang chạy go version sau đó which go một lần nữa ... DAHH) đã đưa tôi đến điều này câu hỏi và cuối cùng đã được giải quyết.


2
2018-01-31 07:43





Bạn đã thử thêm thư mục tuyệt đối của đi đến 'con đường' của bạn?

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

-2
2017-11-04 08:53