Chỉnh sửa: Đường dẫn nhập tương đối không phải là cách để thực hiện trong Go. Thiếu tài liệu cho thấy một cái gì đó về sự phổ biến của đường dẫn tương đối, và tôi không thấy một lý do để sử dụng chúng. Tổ chức mã được đề xuất của Go hoạt động khá tốt. Mỗi gói phải có đường dẫn nhập duy nhất và được nhập ở mọi nơi bằng cùng một đường dẫn nhập đó.
Xem cách gói như github.com/ha/doozerd/peer
imports its neighbors. Đây là một thực tế phổ biến trong các dự án Go và tôi đã nhìn thấy nó rất nhiều lần. Gói camlistore.org/pkg/auth
(cũng trên GitHub; được viết bởi một trong những tác giả chính của Go) nhập camlistore.org/pkg/netutil
bằng đường dẫn đầy đủ.
Thậm chí nếu bạn đang có cả lệnh và thư viện trong cùng một dự án thì phương pháp này hoạt động. Trong các câu hỏi ban đầu của bạn, bạn đã yêu cầu một cách khôn ngoan các phương pháp hay nhất. Tôi đã cố hết sức để giải thích các phương pháp hay nhất về vấn đề này.
Đường dẫn nhập không thể tương đối trong Go. Tôi khuyên bạn nên đọc How to Write Go Code, bài đọc cần thiết về tổ chức các dự án Go. Dưới đây là tổng quan ngắn:
Tạo một thư mục như ~/go
để phát triển Go của bạn. Sau đó nói:
$ export GOPATH=~/go
$ mkdir $GOPATH/{src,bin,pkg}
$GOPATH/src
giữ mã nguồn cho tất cả các gói Go của bạn, ngay cả những người tải về của bạn với go get
. bin
và pkg
giữ đầu ra của bộ sưu tập. Các gói có tên gói main
là các lệnh và năng suất cho các tệp nhị phân có thể thực thi, truy cập vào $GOPATH/bin
. Các gói khác là các thư viện và các tệp đối tượng được biên dịch của chúng được đặt trong $GOPATH/pkg
.
Bây giờ, nếu bạn đặt mã của mình trong $GOPATH/src/matt/meme
, bạn có thể nhập mã đó theo import "matt/meme"
. Bạn nên sử dụng tiền tố cho tên gói của mình và để tên gói ngắn cho thư viện chuẩn. Đó là lý do tại sao tôi đã sử dụng $GOPATH/src/matt/meme
thay vì $GOPATH/src/meme
.
Sắp xếp mã của bạn xung quanh ý tưởng này.
Tôi đã thử cách này theo một vài cách khác nhau và tôi không thấy lỗi mơ hồ mà bạn đề cập đến. Bạn có nghĩa là bạn đã tìm thấy từ ngữ mơ hồ hoặc văn bản thông báo bao gồm từ mơ hồ. Hai cách tôi đã thử là meme/cmd/meme trong GOPATH, và sau đó là bên ngoài GOPATH. Trong cả hai trường hợp, đường dẫn nhập tương đối hoạt động tốt cho tôi. Bạn có thể cung cấp thêm chi tiết về những gì không hiệu quả với bạn không? – Sonia
@Sonia bạn đã thử với công cụ di chuyển chưa? Tôi sẽ bổ sung thêm chi tiết. –
Có. Tôi loại giả định rằng bạn đã có một gói trong meme và một thực thi trong meme/cmd/meme. Đối với trường hợp GOPATH, hãy chạy hoặc đi cài đặt trên tệp thực thi vừa hoạt động. Đối với trường hợp out-of-GOPATH tôi đã biên soạn gói meme với công cụ go 6g và đi gói công cụ. Việc nhập khẩu trong gói chính sau đó chỉ cần thiết để được ../../meme, để trỏ đến .a nhưng nếu không đi công cụ 6g và đi công cụ 6l xây dựng một thực thi làm việc mà truy cập vào gói. – Sonia