2015-10-26 12 views
5

Tôi cố gắng hiểu cách sắp xếp mã đi bằng gói "nội bộ". Hãy để tôi chỉ ra cấu trúc mà tôi có:Cách sử dụng các gói "nội bộ"?

project/ 
    internal/ 
    foo/ 
     foo.go # package foo 
    bar/ 
     bar.go # package bar 
    main.go 

# here is the code from main.go 
package main 

import (
    "project/internal/foo" 
    "project/internal/bar" 
) 

project/ nằm ngoài cây GOPATH. Bất cứ con đường nào tôi cố gắng nhập từ main.go không có tác dụng, trường hợp duy nhất hoạt động tốt là import "./internal/foo|bar". Tôi nghĩ rằng tôi làm một cái gì đó sai hoặc có được "nội bộ" ý tưởng gói sai nói chung. Ai có thể làm mọi thứ rõ ràng hơn được không?

CẬP NHẬT

Ví dụ trên là đúng sự chỉ là những gì tôi cần là để đặt project/ thư mục dưới $GOPATH/src. Vì vậy, điều là con đường nhập khẩu như project/internal/foo|bar là hoàn toàn khả thi nếu chúng ta chỉ nhập nó từ project/ subtree chứ không phải từ bên ngoài.

+5

Bạn không thể import các gói mà không phải là trong '$ GOPATH/src'. Thử tạo gói 'project/baz', bạn cũng không thể nhập gói đó. Đặt tất cả các dự án của bạn vào GOPATH. –

+0

Nếu tôi không muốn đặt mọi dự án theo GOPATH thì sao? –

+2

Đó là cách công cụ hoạt động. Nếu bạn muốn sử dụng một gói, nó cần phải được theo GOPATH. – JimB

Trả lời

6

Các gói phải nằm trong số $GOPATH của bạn để được nhập. Ví dụ bạn đã cung cấp với import "./internal/foo|bar" hoạt động vì nó thực hiện nhập cục bộ. internal chỉ làm cho mã như vậy không chia sẻ thư mục gốc chung cho thư mục internal của bạn không thể nhập các gói trong phạm vi internal.

Nếu bạn đặt tất cả điều này trong gopath của bạn sau đó đã cố gắng để nhập khẩu từ một địa điểm khác nhau như OuterFolder/project2/main.go nơi OuterFolder chứa cả projectproject2 sau đó import "../../project/internal/foo" sẽ thất bại. Nó cũng sẽ thất bại như import "foo" hoặc bất kỳ cách nào khác bạn đã cố gắng do không đáp ứng điều kiện này;

Một nhập khẩu của một con đường có chứa yếu tố “nội bộ” là không được phép nếu mã nhập khẩu nằm ngoài cây bén rễ tại công ty mẹ của thư mục “nội bộ”.

Bây giờ nếu bạn đã có con đường $GOPATH/src/project sau đó bạn có thể làm import "foo"import "bar" từ bên trong $GOPATH/src/project/main.go và việc nhập khẩu sẽ thành công. Những thứ không được chứa bên dưới project tuy nhiên sẽ không thể nhập foo hoặc bar.

0

dưới đây Cách thứ nhất là khả năng mở rộng hơn, đặc biệt là khi bạn có kế hoạch để xây dựng nhiều mã nhị phân

github.com/servi-io/api 
├── cmd/ 
│ ├── servi/ 
│ │ ├── cmdupdate/ 
│ │ ├── cmdquery/ 
│ │ └── main.go 
│ └── servid/ 
│  ├── routes/ 
│  │ └── handlers/ 
│  ├── tests/ 
│  └── main.go 
├── internal/ 
│ ├── attachments/ 
│ ├── locations/ 
│ ├── orders/ 
│ │ ├── customers/ 
│ │ ├── items/ 
│ │ ├── tags/ 
│ │ └── orders.go 
│ ├── registrations/ 
│ └── platform/ 
│  ├── crypto/ 
│  ├── mongo/ 
│  └── json/ 

for more

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