Cách sử dụng gói tùy chỉnh


178

Tôi đang cố gắng tạo và sử dụng gói tùy chỉnh trong Go. Có lẽ nó là một cái gì đó rất rõ ràng nhưng tôi không thể tìm thấy nhiều thông tin về điều này. Về cơ bản, tôi có hai tệp này trong cùng một thư mục:

mylib.go

package mylib

type SomeType struct {

}

chính

package main

import (
    "mylib"
)

func main() {

}

Khi tôi cố gắng go run main.go, tôi nhận được lỗi này:

main.go:4:2: import "mylib": cannot find package

Tôi đã cố chạy go build mylib.gotrước nhưng dường như không làm gì cả (không tạo tệp, không có thông báo lỗi). Vì vậy, bất kỳ ý tưởng làm thế nào tôi có thể làm điều này?


Tôi đã không đặt biến GOPATH, chỉ GOROOT.
nguyệt quế

1
chạy go installtrong thư mục mylibđầu tiên, và thử lại.
Joe

1
Xem thêm chủ đề này .
kostix

@Joe, nó vẫn không thể hoạt động bằng cách chạy "go install" bên trong
hunter_tech

Câu trả lời:


175

Trước tiên, hãy chắc chắn đọc và hiểu tài liệu "Cách viết mã Go" .

Câu trả lời thực tế phụ thuộc vào bản chất của "gói tùy chỉnh" của bạn.

Nếu nó được sử dụng chung, hãy xem xét sử dụng cái gọi là "bố cục mã Github" . Về cơ bản, bạn làm cho thư viện của bạn một go getdự án có thể tách rời .

Nếu thư viện của bạn là để sử dụng nội bộ, bạn có thể đi như thế này:

  1. Đặt thư mục với các tệp thư viện trong thư mục của dự án của bạn.
  2. Trong phần còn lại của dự án, hãy tham khảo thư viện bằng cách sử dụng đường dẫn của nó liên quan đến thư mục gốc của không gian làm việc có chứa dự án.

Để lam sang tỏ:

src/
  myproject/
    mylib/
      mylib.go
      ...
    main.go

Bây giờ, ở cấp cao nhất main.go, bạn có thể import "myproject/mylib"và nó sẽ hoạt động tốt.


1
Nếu tôi tạo một dự án mới (myproject2) trong src /, làm cách nào tôi có thể nhập mylib?
Kiril

2
@Kiril, ý bạn là, làm thế nào để bạn nhập mylibmyproject2? Sau đó, câu trả lời là "bằng cách sử dụng import "myproject/mylib"- ý tưởng là Go tìm kiếm các đường dẫn được nhập trong mỗi thư mục mà nó trích xuất từ GOPATHbiến môi trường (chúng được gọi là" không gian làm việc "), nhưng tìm kiếm này (may mắn) không phải là đệ quy, vì vậy các đường dẫn như vậy là "neo" hiệu quả tại các không gian làm việc tương ứng của họ.
kostix

4
Một cái khác phải có: "Tên gói" .
kostix 6/12/2015

1
@MatthiasSommer, thường là bằng cách trích xuất mylib đó vào một gói chung mà mỗi dịch vụ microservice sử dụng. Chính xác cách "sử dụng" được định nghĩa, tùy thuộc vào quy trình làm việc ưa thích của bạn. Trong phát triển doanh nghiệp-lớp, vendoring thường được sử dụng, nhưng với sự gần đây go modphát triển, một module có thể là câu trả lời (và go modhỗ trợ vendoring các module cũng).
kostix

1
@LeiYang, "gói được nhập" là một thư mục có một hoặc nhiều tệp nguồn Go. Đối với "cách xây dựng gói thành tệp .lib" và sau đó nhập tệp lib "Câu trả lời phụ thuộc vào những gì bạn thực sự muốn hỏi. Nếu bạn quan tâm đến tốc độ biên dịch, thì đừng sợ: bộ đệm công cụ Go Thay vào đó, nếu bạn muốn hỏi liệu có thể biên dịch và phân phối gói được biên dịch nhị phân hay không, thì câu trả lời là không .
kostix

68

Đối với loại cấu trúc thư mục này:

main.go
mylib/
  mylib.go

Cách đơn giản nhất là sử dụng cái này:

import (
    "./mylib"
)

1
Điều này không hoạt động nữa trong các phiên bản gần đây vì gói sẽ không được tìm thấy. Nhập chính xác sẽ là foo/mylib(giả sử thư mục chứa main.go là foo).
nemo

6
@nemo, với phiên bản mới nhất của go, tôi luôn sử dụng "./mylib" và nó hoạt động.
laurent

3
Sử dụng go 1.2 và tôi đồng ý với @ this.lau_
canadadry 17/03/2016

8
Hãy nhận ra rằng điều này làm cho go installphá vỡ. Nếu bạn đang xây dựng một dự án độc lập mà bạn muốn mọi người tải xuống và chạy go build, điều này vẫn ổn - tuy nhiên, tôi sẽ sử dụng "bố cục mã Github" được đề cập ở trên (ngay cả khi tắt bitbucket hoặc tương tự) nếu bạn muốn go installhỗ trợ đầy đủ .
quang hóa

Tôi đề nghị không sử dụng cách này. Nó sẽ phá vỡ trời ơi. trời ơi nó không hiểu về "." nhập khẩu
King Jk

6

Đối với một dự án được lưu trữ trên GitHub, đây là những gì mọi người thường làm

github.com/
  laike9m/
    myproject/
      mylib/
        mylib.go
        ...
      main.go

mylib.go

package mylib

...

chính

import "github.com/laike9m/myproject/mylib"

...

6

Tôi là một lập trình viên giàu kinh nghiệm, nhưng, khá mới mẻ trong thế giới Go! Và tôi thú nhận rằng tôi đã gặp một vài khó khăn để hiểu về Go ... Tôi đã gặp phải vấn đề tương tự khi cố gắng sắp xếp các tệp đi của mình trong các thư mục con. Cách tôi đã làm:

GO_Directory (cái được gán cho $ GOPATH)

GO_Directory //the one assigned to $GOPATH
__MyProject
_____ main.go
_____ Entites
_____ Fiboo // in my case, fiboo is a database name
_________ Client.go // in my case, Client is a table name

Trên tệp MyProject \ Entities \ Fiboo \ Client.go

package Fiboo

type Client struct{
    ID int
    name string
}

trên tệp MyProject \ main.go

package main

import(
    Fiboo "./Entity/Fiboo" 
)

var TableClient  Fiboo.Client

func main(){
    TableClient.ID = 1
    TableClient.name = 'Hugo'

    // do your things here
}

(Tôi đang chạy Go 1.9 trên Ubuntu 16.04)

Và hãy nhớ các bạn, tôi là người mới trên Go. Nếu những gì tôi đang làm là thực hành xấu, hãy cho tôi biết!


3

một giải pháp khác:
thêm src/myprojectvào $ GOPATH.

Sau đó import "mylib"sẽ biên dịch.


điều này sẽ không hoạt động đối với các đường dẫn đi được, chẳng hạn như các gói được lưu trữ trên github.
Gustav
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.