Getting Started
Tóm tắt lại bài trước:
- Go Module là gì?
- Là đơn vị mã nguồn độc lập trong Go.
- Mỗi module có go.mod chứa thông tin: tên module, các thư viện phụ thuộc, version...
Ví du:
go mod init example.com/hello
==> Tạo ra module example.com/hello, và file go.mod.
- Go Workspaces (go.work) là gì?
Là cách để làm việc với nhiều module cùng lúc, trong 1 project.
Vì sao cần workspace?
Khi bạn có nhiều module liên quan (VD: hello
, greetings
), và muốn:
- Thay đổi cả hai cùng lúc.
- Test giao tiếp giữa chúng mà không phải dùng
go get
tải từ internet.
Ví du:
project/
├── go.work
├── hello/ --> module 1 (ứng dụng chính)
│ └── go.mod
├── greetings/ --> module 2 (thư viện con) └── go.mod
Trong go.work:
go work init ./hello ./greetings
File go.work:
go 1.21 use ( ./hello ./greetings
)
==> Giúp Go nhận diện tất cả module trong workspace, dùng trực tiếp code local, không cần tải qua mạng.
Tutorial: Getting started with multi-module workspaces
Giới thiệu các khái niệm cơ bản về việc tạo và sử dụng workspace đa module trong Go. Workspace đa module hữu ích khi bạn muốn thực hiện các thay đổi trên nhiều module cùng lúc.
Hướng dẫn này giới thiệu các khái niệm cơ bản về workspace đa module trong Go. Với workspace đa module, bạn có thể thông báo cho lệnh go rằng bạn đang viết mã trên nhiều module cùng lúc và dễ dàng build và chạy mã trong các module đó.
Tạo một module cho mã nguồn của bạn
$ mkdir hello
$ cd hello
$ go mod init example.com/hello
go: creating new go.mod: module example.com/hello
Thêm phụ thuộc đến package golang.org/x/example/hello/reverse bằng lệnh:
$ go get golang.org/x/example/hello/reverse
Tạo file hello.go trong thư mục hello với nội dung:
package main import ( "fmt" "golang.org/x/example/hello/reverse"
) func main() { fmt.Println(reverse.String("Hello"))
}
Chạy chương trình:
$ go run .
olleH
Tạo workspace
Bây giờ bạn sẽ tạo file go.work để chỉ định workspace với các module.
Tại thư mục workspace, chạy:
$ go work init ./hello
Lệnh trên tạo file go.work cho workspace chứa module trong ./hello.
Dòng go chỉ định version của Go dùng để hiểu file.
Dòng use nói với Go rằng module trong thư mục hello sẽ là module chính khi build.
Vì vậy, ở bất kỳ thư mục con nào của workspace, module này sẽ được kích hoạt.
Chạy chương trình từ thư mục workspace $ go run ./hello
olleH
Lệnh go run hoạt động vì Go biết module nằm ở đâu nhờ go.work. Nếu bạn chạy bên ngoài workspace hoặc không có file này, lệnh sẽ thất bại.
Tải và chỉnh sửa module golang.org/x/example/hello
Tiếp theo, bạn sẽ tải source code của module golang.org/x/example/hello, thêm nó vào workspace, và thêm một hàm mới vào package reverse.
Clone repository Từ thư mục workspace, chạy:
$ git clone https://go.googlesource.com/example
Thêm module vào workspace
Module nằm trong ./example/hello, thêm vào workspace:
$ go work use ./example/hello
Nội dung file go.work lúc này sẽ là:
Giờ workspace đã bao gồm cả module example.com/hello và golang.org/x/example/hello.
Thêm hàm mới
Tạo một file mới tên int.go trong workspace/example/hello/reverse:
Chỉnh sửa file hello
Từ thư mục workspace, chạy:
$ go run ./hello
olleH 10642
- Go sẽ tìm module từ các thư mục được chỉ định trong go.work.
- Workspace giúp bạn không cần dùng replace trong go.mod mà vẫn có thể chỉnh sửa và kiểm thử nhiều module cùng lúc.
Bước tiếp theo (Future step)
Để phát hành module, bạn cần tạo release, ví dụ v0.1.0 bằng cách tag trong Git. Sau đó, bạn có thể cập nhật module này từ module hello như sau:
cd hello
go get golang.org/x/example/hello@v0.1.0
Tìm hiểu thêm về workspace
Một số lệnh bổ sung làm việc với workspace:
- go work use [-r] [dir]: thêm thư mục vào go.work. Nếu -r được dùng, sẽ đệ quy trong thư mục con.
- go work edit: chỉnh sửa file go.work tương tự như go mod edit.
- go work sync: đồng bộ phụ thuộc từ workspace vào từng module
Xem thêm tại: https://go.dev/ref/mod#workspaces