Cấu trúc hệ thống tệp của một dự án Go

Cấu trúc thư mục

Các dự án cờ vây được sáng tác bởigói hàng. Chúng tôi gọilệnhcác gói cómainđịnh danh.

Một dự án có thể có

  • 1gói hàng
  • ngói hàng
  • 1chỉ huy
  • 1lệnh và1gói hàng
  • nlệnh và1gói hàng
  • 1lệnh vàngói hàng
  • nlệnh vàngói hàng

Tùy thuộc vào tính chất của dự án của bạn mà bạn cần tổ chức cấu trúc thư mục theo một cách nhất định.

Một số ví dụ trong thế giới thực

Hãy xem một số ví dụ thực tế về điều này trong tự nhiên, ở đây bên dưới. Tôi lấy chúng từNăm gợi ý để thiết lập dự án cờ vâycủa Dave Cheney.

Ví dụ về một dự án với1gói:

https://github.com/kr/fs

Ví dụ về một dự án vớingói hàng

https://github.com/pkg/term

Ví dụ về một dự án với1chỉ huy

https://github.com/tools/godep

Ví dụ về một dự án với1lệnh và1gói hàng

https://github.com/monochromegane/the_platinum_searcher

Ví dụ về một dự án vớinlệnh vàngói hàng

https://github.com/golang/tools

Các quy ước về cấu trúc tệp bên trong một dự án

Từ những ví dụ đó, chúng ta có thể nói những quy ước sau:

Nếu bạn có một lệnh, nó có thể tồn tại trong mộtmain.gotệp trong thư mục gốc của dự án.

Với nhiều hơn một lệnh, hãy tạo mộtcmd/và trong thư mục này, hãy tạo một thư mục với tên của lệnh. Trong mỗi thư mục, lý tưởng nhất là.gotệp có cùng tên sẽ chứamain()chức năng, mặc dù nó không bắt buộc.

Các gói đi trong thư mục riêng của chúng, trừ khi bạn chỉ có một gói.

Vị trí hệ thống tệp cho các gói đã cài đặt

Bất kỳ dự án Go nào cũng có thể được cài đặt bằng cách sử dụnggo get.go getsẽ cài đặt các gói dưới$GOPATH/src. Ví dụ như đánh máy

go get github.com/kr/fs

sẽ tải xuống và cài đặt repo 1 gói có tạihttps://github.com/kr/fs, và nó sẽ đặt nó dưới$GOPATH/src/github.com/kr/fs. Chúng tôi chỉ có thể tham khảo nó trong các chương trình của chúng tôi bằng cách sử dụngimport github.com/kr/fs.

Điều gì sẽ xảy ra nếu chúng ta gõ

go get github.com/tools/godep

thay thế? Hãy nhớ rằng, đây là kho lưu trữ một lệnh mà chúng tôi đã liệt kê trước đây.

go getsẽ tải xuống giống như nó đã làm chogithub.com/kr/fs, và đặt nó dưới$GOPATH/src, NHƯNG vì nó là một lệnh, nó cũng sẽ biên dịch và tạo$GOPATH/bin/godepnhị phân.

Các lệnh Go được biên dịch theo tên của thư mục bao quanh, trong trường hợp này, thư mục là thư mục gốc, vì vậy nógodep. Trong trường hợp có nhiều lệnh, nó sẽ lấythư mục con cuối cùngTên. Vd: một lý tưởnggithub.com/flaviocopes/tools/cmd/unzipsẽ được biên dịch thànhunzip. Nó cókhông phảilấy tên của tệp chứamain()chức năng.

Không gian làm việc

Cờ vây có một khái niệm khá độc đáo vềkhông gian làm việc. Không gian làm việc là cấu trúc thư mục$GOPATHchỉ tới. Khi bạn tạo một không gian làm việc mới, hãy thêm$GOPATH/binđến cả đường dẫn của bạn. Ví dụ: nếu bạn muốn đặt không gian làm việc của mình thành~/go(theo cách này là mặc định):

export GOPATH=~/go
export PATH=~/go/bin:$PATH

Bây giờ, bất kỳ mã Go nào bạn chạy sẽ tham chiếu đến thư mục này. Điều này cho phép bạn tạo không gian làm việc riêng biệt, mặc dù như đã nêutrong tài liệu chính thức,

Các lập trình viên Go thường giữ tất cả mã Go của họ trong một không gian làm việc duy nhất.

Lưu ý rằng điều này khác với các môi trường lập trình khác, trong đó mọi dự án đều có một không gian làm việc riêng biệt và các không gian làm việc này được gắn chặt với các kho lưu trữ kiểm soát phiên bản.

Đây là một ví dụ về không gian làm việc, được liệt kê trong tài liệu chính thức:

    bin/
        hello                          # command executable
        outyet                         # command executable
    pkg/
        linux_amd64/
            github.com/golang/example/
                stringutil.a           # package object
    src/
        github.com/golang/example/
            .git/                      # Git repository metadata
        hello/
            hello.go               # command source
        outyet/
            main.go                # command source
            main_test.go           # test source
        stringutil/
            reverse.go             # package source
            reverse_test.go        # test source
        golang.org/x/image/
            .git/                  # Git repository metadata
        bmp/
            reader.go              # package source
            writer.go              # package source
        #... (many more repositories and packages omitted) ...

Biết được điều này, hãy cùng xem ..

Nơi đặt các lệnh và gói của bạn

Khi chạy các lệnh bằng cách sử dụnggo run, bạn có thể có dự án của mình ở bất cứ đâu bạn thích, nhưng đây là một cách tiếp cận chỉ hữu ích để kiểm tra nhanh.

Bạn nên tạo các chương trình của mình bên trong$GOPATH/srcthư mục, với không gian tên duy nhất của bạn, ví dụ:

$GOPATH/src/github.com/flaviocopes/hello

Khi chạy (từ bất kỳ đâu trong hệ thống)

go install github.com/flaviocopes/hello

Go sẽ biên dịch và đặthellonhị phân trong$GOPATH/bin, sẵn sàng chạy từ bất kỳ đâu trong hệ thống.

Đối với các gói cũng vậy,ngoại trừđiều đó khi chạygo install, nó sẽ đặt gói đã biên dịch dưới$GOPATH/pkg.

Tài liệu tham khảo


Các hướng dẫn về go khác: