2013-01-11 13 views
15

Tôi đang xây dựng một thư viện, nhưng tôi cũng muốn nó có thể sử dụng được dưới dạng nhị phân độc lập.Tôi có thể có thư viện và mã nhị phân có cùng tên không?

Ví dụ: giả sử tôi đang xây dựng triển khai Tar. Tar thường được sử dụng như một lệnh, nhưng nó cũng có thể được sử dụng như một thư viện. Trực giác, tôi sẽ làm một cái gì đó như thế này:

src/ 
    tar/ 
     tar.go # belongs to package tar 
     main.go # imports tar and provides a main function 

Điều này dường như không hoạt động. Từ documentation, có vẻ như "lệnh" phải có tên riêng biệt từ thư viện. Thích ứng với ví dụ đưa ra đó để ví dụ này, tôi có cấu trúc thư mục sau đây:

src/ 
    tar/ 
     tar.go # belongs to package tar 
    tarbin/ 
     main.go # imports tar and provides a main function 

Tuy nhiên, điều này tạo ra một lệnh gọi tarbin, không tar trong $GOPATH/bin. Cách giải quyết mà tôi tìm thấy là làm go build -o $GOPATH/bin/tar tar, nhưng tôi cảm thấy mình đang làm điều gì đó khủng khiếp sai. Có cách nào tốt hơn?

Lưu ý: Tôi biết rằng tar được bao gồm trong libs chuẩn, tôi chỉ sử dụng nó làm ví dụ.

Trả lời

21

tôi có lẽ muốn làm điều này

src/ 
    tar/ 
     tar.go   # tar libary 
     tar/ 
      main.go # tar binary 

Điều đó sẽ cung cấp cho bạn một số nhị phân gọi là tar và thư viện gọi tar

Hãy nói rằng bạn đang lưu trữ này trên github sau đó bạn muốn

src/ 
    github.com/ 
     you/ 
      tar/ 
       tar.go   # tar libary 
       tar/ 
        main.go # tar binary 

Điều gì sẽ cung cấp cho bạn một tệp nhị phân được gọi là tar khi bạn thực hiện go get install github.com/you/tar/tar và thư viện được gọi là github.com/you/tar khi bạn làm go get install github.com/you/tar

Tùy theo mà bạn cảm thấy là quan trọng hơn bạn có thể trao đổi các thư viện và các nhị phân trên

src/ 
    github.com/ 
     you/ 
      tar/ 
       main.go   # tar binary 
       tar/ 
        tar.go   # tar libary 

Giữ tất cả các mã trong một cây cho phép bạn làm go install ./... từ gốc để xây dựng tất cả các gói và gói con là một lợi thế. go test|fmt ./.... (Lưu ý rằng thực sự là 3 dấu chấm!)

+0

Tuyệt vời! Tôi thích điều này tốt hơn nhiều so với 'go build -o ...' hack ... – tjameson

+0

Ngoại trừ "go build" sẽ thất bại vì nhị phân của bạn sẽ được đặt tên giống như một thư mục cục bộ ("tar"). Bạn phải sử dụng "go build -o" trong trường hợp này. – Gravis

+0

@Gravis Tôi hiểu ý của bạn là gì. Tuy nhiên, 'go install' là những gì bạn muốn sử dụng để xây dựng binary - khá nhiều không bao giờ sử dụng' go build' vì nó không cache các build. Tôi sẽ chỉnh sửa phản hồi để xóa tham chiếu đến 'go build'. –