Blog Go
Làm quen với workspaces
Go 1.18 bổ sung workspace mode cho Go, cho phép bạn làm việc trên nhiều module đồng thời.
Bạn có thể lấy Go 1.18 tại trang download. Release notes có thêm chi tiết về tất cả các thay đổi.
Workspaces
Workspaces trong Go 1.18 cho phép bạn làm việc trên
nhiều module cùng lúc mà không cần sửa tệp go.mod của từng
module. Mỗi module trong một workspace được coi là một main module khi
giải quyết phụ thuộc.
Trước đây, để thêm một tính năng vào một module rồi dùng nó trong module khác, bạn
cần либо phát hành các thay đổi lên module thứ nhất, либо sửa
tệp go.mod của module phụ thuộc
với một chỉ thị replace trỏ tới các thay đổi cục bộ chưa phát hành đó. Để
phát hành mà không có lỗi, bạn lại phải xóa chỉ thị replace khỏi
tệp go.mod của module phụ thuộc sau khi đã phát hành thay đổi cục bộ trên
module thứ nhất.
Với Go workspaces, bạn kiểm soát mọi phụ thuộc bằng một tệp go.work ở
gốc thư mục workspace. Tệp go.work có các chỉ thị use và
replace ghi đè các tệp go.mod riêng lẻ, nên không còn
cần sửa từng tệp go.mod một.
Bạn tạo một workspace bằng cách chạy go work init với danh sách các thư mục
module làm đối số cách nhau bằng dấu cách. Workspace không nhất thiết phải chứa
các module mà bạn đang làm việc cùng. Lệnh init tạo một tệp go.work
liệt kê các module trong workspace. Nếu chạy go work init mà không có
đối số, lệnh sẽ tạo một workspace trống.
Để thêm module vào workspace, hãy chạy go work use [moddir] hoặc tự sửa
tệp go.work. Chạy go work use -r . để thêm đệ quy các thư mục trong
thư mục đối số mà có tệp go.mod vào workspace. Nếu một thư mục
không có tệp go.mod, hoặc không còn tồn tại nữa, thì chỉ thị use cho
thư mục đó sẽ bị xóa khỏi tệp go.work.
Cú pháp của tệp go.work tương tự tệp go.mod và có các
chỉ thị sau:
go: phiên bản go toolchain, ví dụgo 1.18use: thêm một module trên đĩa vào tập main modules của workspace. Đối số của nó là một đường dẫn tương đối tới thư mục chứa tệpgo.modcủa module. Chỉ thịusekhông thêm các module trong thư mục con của thư mục đã chỉ định.replace: Tương tự chỉ thịreplacetrong tệpgo.mod, một chỉ thịreplacetrong tệpgo.workthay thế nội dung của một phiên bản cụ thể của một module, hoặc mọi phiên bản của một module, bằng nội dung nằm ở nơi khác.
Quy trình làm việc
Workspaces rất linh hoạt và hỗ trợ nhiều kiểu quy trình làm việc. Các phần sau là cái nhìn tổng quan ngắn gọn về những gì chúng tôi nghĩ sẽ là phổ biến nhất.
Thêm một tính năng vào module upstream và dùng nó trong chính module của bạn
-
Tạo một thư mục cho workspace.
-
Clone module upstream mà bạn muốn sửa.
-
Thêm tính năng của bạn vào phiên bản cục bộ của module upstream.
-
Chạy
go work init [path-to-upstream-mod-dir]trong thư mục workspace. -
Sửa module của chính bạn để hiện thực tính năng vừa thêm vào module upstream.
-
Chạy
go work use [path-to-your-module]trong thư mục workspace.Lệnh
go work usethêm đường dẫn đến module của bạn vào tệpgo.work:go 1.18 use ( ./path-to-upstream-mod-dir ./path-to-your-module ) -
Chạy và kiểm thử module của bạn với tính năng mới vừa thêm vào module upstream.
-
Phát hành module upstream với tính năng mới.
-
Phát hành module của bạn dùng tính năng mới đó.
Làm việc với nhiều module phụ thuộc lẫn nhau trong cùng một kho mã
Khi làm việc với nhiều module trong cùng một kho mã, tệp go.work
xác định workspace thay vì dùng chỉ thị replace trong từng
tệp go.mod.
-
Tạo một thư mục cho workspace.
-
Clone kho mã chứa các module bạn muốn sửa. Các module không nhất thiết phải nằm trong thư mục workspace vì bạn sẽ chỉ ra đường dẫn tương đối tới từng module bằng chỉ thị
use. -
Chạy
go work init [path-to-module-one] [path-to-module-two]trong thư mục workspace.Ví dụ: Bạn đang làm việc trên
example.com/x/tools/groundhog, vốn phụ thuộc vào các package khác trong moduleexample.com/x/tools.Bạn clone kho mã rồi chạy
go work init tools tools/groundhogtrong thư mục workspace.Nội dung tệp
go.worksẽ tương tự như sau:go 1.18 use ( ./tools ./tools/groundhog )Mọi thay đổi cục bộ trong module
toolssẽ đượctools/groundhogsử dụng trong workspace của bạn.
Chuyển đổi giữa các cấu hình phụ thuộc
Để kiểm thử module của bạn với các cấu hình phụ thuộc khác nhau, bạn có thể либо
tạo nhiều workspace với các tệp go.work riêng, либо giữ một workspace
duy nhất rồi comment các chỉ thị use mà bạn không muốn trong một tệp go.work.
Để tạo nhiều workspace:
- Tạo các thư mục riêng cho những nhu cầu phụ thuộc khác nhau.
- Chạy
go work inittrong từng thư mục workspace. - Thêm các phụ thuộc bạn muốn trong mỗi thư mục bằng
go work use [path-to-dependency]. - Chạy
go run [path-to-your-module]trong từng thư mục workspace để dùng các phụ thuộc do tệpgo.workcủa thư mục đó chỉ định.
Để thử các phụ thuộc khác nhau trong cùng một workspace, mở tệp go.work
và thêm hoặc comment các phụ thuộc mong muốn.
Vẫn đang dùng GOPATH?
Có thể workspaces sẽ làm bạn đổi ý. Người dùng GOPATH có thể giải quyết
phụ thuộc của mình bằng một tệp go.work đặt ở gốc thư mục GOPATH.
Workspaces không nhắm tới việc tái tạo hoàn toàn mọi quy trình GOPATH,
nhưng chúng có thể tạo ra một cấu hình chia sẻ được phần nào sự tiện lợi của GOPATH
trong khi vẫn giữ được lợi ích của modules.
Để tạo một workspace cho GOPATH:
- Chạy
go work initở gốc thư mụcGOPATH. - Để dùng một module cục bộ hoặc một phiên bản cụ thể làm phụ thuộc trong
workspace, hãy chạy
go work use [path-to-module]. - Để thay thế các phụ thuộc hiện có trong tệp
go.modcủa các module, hãy dùnggo work replace [path-to-module]. - Để thêm tất cả module trong GOPATH hoặc bất kỳ thư mục nào, hãy chạy
go work use -rđể thêm đệ quy các thư mục có tệpgo.modvào workspace. Nếu một thư mục không có tệpgo.mod, hoặc không còn tồn tại, thì chỉ thịusecho thư mục đó sẽ bị xóa khỏi tệpgo.work.
Lưu ý: Nếu bạn có các dự án không có tệp
go.modmà muốn thêm vào workspace, hãy chuyển vào thư mục dự án của chúng và chạygo mod init, rồi thêm module mới vào workspace bằnggo work use [path-to-module].
Các lệnh workspace
Bên cạnh go work init và go work use, Go 1.18 còn giới thiệu các
lệnh sau cho workspaces:
go work sync: đẩy các phụ thuộc trong tệpgo.workngược lại vào các tệpgo.modcủa từng module trong workspace.go work edit: cung cấp giao diện dòng lệnh để sửago.work, chủ yếu dùng cho công cụ hoặc script.
Các lệnh build nhận biết module và một số subcommand của go mod sẽ xem xét biến môi trường GOWORK
để xác định xem chúng có đang ở trong ngữ cảnh workspace hay không.
Workspace mode được bật nếu biến GOWORK chỉ tới một đường dẫn tệp kết thúc bằng
.work. Để xác định tệp go.work nào đang được dùng, hãy chạy
go env GOWORK. Đầu ra sẽ rỗng nếu lệnh go không ở trong workspace
mode.
Khi workspace mode được bật, tệp go.work sẽ được parse để xác định ba
tham số của workspace mode: một phiên bản Go, một danh sách thư mục và một
danh sách thay thế.
Một vài lệnh có thể thử trong workspace mode (miễn là bạn đã biết chúng làm gì!):
go work init
go work sync
go work use
go list
go build
go test
go run
go vet
Cải tiến trải nghiệm trình soạn thảo
Chúng tôi đặc biệt hào hứng với những nâng cấp cho language server của Go là gopls và phần mở rộng VSCode Go, giúp việc làm việc với nhiều module trong một trình soạn thảo tương thích LSP trở nên mượt mà và đáng giá.
Tìm tham chiếu, tự động hoàn thành mã và đi tới định nghĩa hoạt động xuyên các module
trong workspace. Phiên bản 0.8.1
của gopls bổ sung diagnostics, completion, formatting và hover cho
tệp go.work. Bạn có thể tận dụng các tính năng này của gopls với bất kỳ trình soạn thảo nào
tương thích LSP.
Ghi chú riêng cho từng trình soạn thảo
- Bản phát hành mới nhất của vscode-go
cho phép truy cập nhanh đến tệp
go.workcủa workspace qua menu Quick Pick trên thanh trạng thái Go.

- GoLand hỗ trợ workspaces và có kế hoạch bổ sung
tô sáng cú pháp cùng tự động hoàn thành mã cho tệp
go.work.
Để biết thêm thông tin về việc dùng gopls với các trình soạn thảo khác nhau, hãy xem gopls documentation.
Tiếp theo là gì?
- Tải xuống và cài đặt Go 1.18.
- Thử dùng workspaces với Go workspaces Tutorial.
- Nếu bạn gặp bất kỳ vấn đề nào với workspaces, hoặc muốn đề xuất điều gì, hãy tạo issue.
- Đọc tài liệu bảo trì workspace.
- Khám phá các lệnh module để làm việc bên ngoài một
module đơn lẻ, bao gồm
go work init,go work syncvà nhiều lệnh khác.
Bài tiếp theo: Khi nào nên dùng Generics
Bài trước: Go Giảm thiểu Tấn công Chuỗi Cung ứng như thế nào
Mục lục blog