Bài học theo mô-đun (4/5)
Đi mô-đun
Mô-đun Go là một đơn vị có thể phiên bản được tạo thành từ một hoặc nhiều gói. Đây là nền tảng của hệ thống phụ thuộc hiện đại (Go 1.11+): không còn GOPATH, không còn vendor bắt buộc, các phụ thuộc rõ ràng và có thể lặp lại.
go.mod: bảng kê khai mô-đun
module example.com/myapp
go 1.22
require (
github.com/google/uuid v1.6.0
golang.org/x/time v0.5.0
)
Ba chỉ thị chính:
module <path>— đường dẫn nhập của mô-đun. Tất cả các gói nội bộ đều được nhập dưới dạngexample.com/myapp/sub/pkg. Nó không nhất thiết phải là một URL thực nhưng để xuất bản quago getthì nó phải phân giải được.go <version>— yêu cầu phiên bản Go tối thiểu (cũng được sử dụng để kiểm soát những tính năng ngôn ngữ nào được phép, ví dụ: range-over-func trong 1.23).require— phần phụ thuộc trực tiếp với phiên bản chính xác của chúng.
Các chỉ thị khác: replace (thay thế dep bằng một ngã ba hoặc đường dẫn cục bộ), exclude, retract.
go.sum: tệp khóa mật mã
Cùng với go.mod, go.sum còn chứa hàm băm mật mã của MỌI phiên bản đã tải xuống (bao gồm cả các phần phụ thuộc bắc cầu). Nó đảm bảo khả năng tái tạo: nếu ai đó giả mạo một phiên bản đã xuất bản thì quá trình xây dựng sẽ không thành công.
Luôn cam kết. Nó được cập nhật tự động bằng các lệnh go.
Các lệnh cần thiết
go mod init example.com/myapp # create go.mod
go get github.com/google/uuid # add the dep at its latest version
go get github.com/google/uuid@v1.5.0 # specific version
go get -u ./... # upgrade every dep
go mod tidy # remove unused deps, add missing ones
go mod download # download everything into the cache
go mod why github.com/x/y # explain why a dep is included
go mod graph # full dependency graphgo mod tidy là ứng dụng bạn chạy sau mỗi thay đổi đối với lệnh nhập: nó đảm bảo rằng go.mod phản ánh chính xác các gói được sử dụng thực sự.
Phiên bản nhập ngữ nghĩa (SIV)
Các phiên bản tuân theo SemVer: v1.2.3 = MAJOR.MINOR.PATCH. Phần thú vị là major v2+:
- Chính
v0vàv1→ đường dẫn thông thường:github.com/foo/bar. - Chính
v2trở lên → đường dẫn bao gồm phiên bản chính:github.com/foo/bar/v2.
import "github.com/foo/bar/v2"Điều này cho phép bạn nhập cùng lúc cả v1 và v2 của cùng một thư viện (hữu ích trong quá trình di chuyển liên tục).
Nhập đường dẫn và gói nội bộ
Nếu mô-đun của bạn là example.com/myapp, thì thư mục con utils/ sẽ được nhập dưới dạng:
import "example.com/myapp/utils"Đường dẫn chỉ phụ thuộc vào tên được khai báo trong go.mod, không phụ thuộc vào vị trí trên đĩa: cùng một mã trong một thư mục khác vẫn tiếp tục hoạt động.
Chế độ không gian làm việc (Go 1.18+)
Để làm việc trên nhiều mô-đun tham chiếu lẫn nhau cùng lúc (ví dụ: thư viện và ứng dụng sử dụng nó):
go work init ./lib ./appĐiều này tạo ra go.work: go build sẽ sử dụng phiên bản địa phương của ./lib thay vì tải xuống phiên bản đã xuất bản. Không cam kết go.work (đây là môi trường phát triển).
Bài tập
Mô-đun này là example.com/myapp và chứa thư mục con utils. Nhập gói phụ vào main bằng đường dẫn đầy đủ.
Hiển thị gợi ý
Đường dẫn nhập là tên mô-đun (từ go.mod) cộng với đường dẫn tương đối của thư mục.
Giải pháp khả dụng sau 3 lần thử
Biến các lần nhập riêng lẻ thành một nhóm nhập bằng cú pháp import ( ... ), nhập cả fmt và os.
Giải pháp khả dụng sau 3 lần thử
Lệnh nào loại bỏ các phần phụ thuộc không còn được nhập từ go.mod và thêm những phần phụ thuộc còn thiếu?
$ go mod ???