Khi bạn bắt đầu học Go, phải mất một thời gian để hiểu về cách thiết lập môi trường phát triển của bạn. Chúng ta cần học thêm một chút để hiểu trình biên dịch tìm kiếm các file module được import.

Một bước bắt buộc cần làm khi thiết lập môi trường phát triển, là cấu hình biến môi trường GOPATH. $GOPATH được sử dụng bởi trình biên dịch Go để tìm kiếm các module trong khi xây dựng ứng dụng Go của bạn. $GOPATH chứa mã nguồn và file nhị phân của module.

GOPATH chứa các thư mục dưới đây:

  • $GOPATH/src - chứa tất cả mã nguồn Go của bạn và thư mục mã nguồn bên thứ ba.

  • $GOPATH/pkg - chứa các gói

  • $GOPATH/bin - chữa các filenhị phân

Trong bản phát hành chính thức mới nhất của Go v1.11, GOPATH không còn là bắt buộc nữa. Đội ngũ Go có giới thiệu về modules trong phiên bản mới này. Modules là tập hợp các gói Go có liên quan. Đây là một bước tiến quan trọng mà đội ngũ Go đã thực hiện để cải thiện quản lý gói trong Go.

Với version 1.11 hiện tại, bạn có thể xây dựng ứng dụng Go của mình bên ngoài GOPATH. Trong version 1.11, khi bạn đặt mã nguồn bên trong $GOPATH, nó bỏ qua tính năng của modules và sử dụng GOPATH cho tìm kiếm các phụ thuộc mã nguồn. Tuy nhiên, nếu bạn đặt mã nguồn bên ngoài GOPATH, hỗ trợ modules được bật tự động. Điều này có nghĩa là, bạn có thể xây dựng ứng dụng của mình từ nhiều thư viện mà bạn muốn!

Tạo một ví dụ đơn giản về modules bạn có thể dử dụng play ground với mã nguồn ở đây  https://github.com/donvito/hellomod. Bạn có thể lấy một bản sao từ repo và sử dụng cho việc học tập của riêng bạn. Module có 3 bản phát hành hay phiên bản.

 

Để minh hoạ cách sử dụng module trong ứng dụng của bạn, giả sử rằng hellomod là một module bên thứ ba mà bạn yêu cầu trong ứng dụng của bạn.

Hãy tạo một ứng dụng khách hàng sử dụng modules hellomod. Dưới đây là mã mà chúng ta có thể bắt đầu. Lưu như main.go trong thư viện bạn muốn.

main.go

package main

import (
    "github.com/donvito/hellomod"
)

func main() {
	hellomod.SayHello()
}

 

Khởi tạo module hỗ trợ. Đảm bảo GOPATH không được thiết lập để chúng ta có thể tự động sử dụng tính năng modules trong Go 1.11.  Thực hiện lệnh dưới đây trong terminal.

$ go mod init hello

Điều này sẽ tạo một tập tin go.mod. Không có gì để xem ở đây ngoại trừ tên module bạn vừa khởi tạo. go.mod sẽ chứa

module hello

Sau khi thực hiện "go mod init hello", xây dựng ứng dụng của bạn.

$ go build 

Những gì "go build" làm là giải quyết các phụ thuộc của ứng dụng dựa trên các câu lệnh import bạn nhập và thêm các phiên bản mới nhất của phụ thuộc của bạn, sau đó biên dịch ứng dụng của bạn và tạo ra mã nhị phân.

Kể từ phiên bản mới nhất của hellomod là v1.0.1, go.mod bây giờ chứa

module hello

require github.com/donvito/hellomod v1.0.1

"go build" cũng tạo ra một tệp go.sum chứa các tổng kiểm tra mật mã dự kiến của nội dung của các phiên bản mô-đun cụ thể. Định nghĩa được lấy từ đây https://github.com/golang/go/wiki/Modules#releasing-modules-all-versions

github.com/donvito/hellomod v1.0.1 h1:tOU3KDwvrGW7QUHXYQnk6YUD+92aTsRmJItJTD9f4I4=
github.com/donvito/hellomod v1.0.1/go.mod h1:DuOSvrBCwGkjX0WS5ohdpC/q67fS0Mde3LEM+2jeHSw=

 

Dưới đây là tóm lược các lệnh mà Go team đã thực hiện cho đến nay

Bạn có thể chạy mã nhị phân được tạo bởi "go build" để kiểm tra nếu chúng ta đang sử dụng hellomod v1.0.1.

$ ./hello
Hello World v1.0.1!!!

Giả sử bạn muốn trở lại phiên bản trước v1.0.0 của module hellomod. Bạn có thể chỉ thi hành lệnh bên dưới. Điều này sẽ sử dụng phiên bản trước.

$ go get github.com/donvito/hellomod@v1.0.0
$ go build
$ ./hello
Hello Word

Để tham khảo, đây là những gì v1.0.0 trông giống như

hellomod v1.0.0

package hellomod

import (
	"fmt"
)

//SayHello function
func SayHello() {
	fmt.Println("Hello World")
}

Để nâng cấp lên phiên bản chính, bạn cần thay đổi phiên phản trong import của bạn.

main.go

package main
import (
    "github.com/donvito/hellomod/v2"
)
 
func main() {
         hellomod.SayHello("Melvin")
}

Sau đó xây dựng ứng dụng và chạy nhị phân "hello".

$ go build
$ ./hello
Hello MelvinHello World v2.0.0!!!

Đây là cách go.mod của bạn trông giống như sau khi thực hiện "go build".

module hello

require (
	github.com/donvito/hellomod v1.0.0
	github.com/donvito/hellomod/v2 v2.0.0
)

Chúng ta có thể sử dụng các phiên bản khác nhau của cùng module.

Đây là một ví dụ mà chúng ta có thể thấy rằng 2 phiên bản khác nhau của một module có thể được sử dụng độc lập. Bạn cần sử dụng tên riêng cho mỗi phiên bản để tránh xung đột.

main.go ( client application using 2 different versions of the hellomod module )

package main

import (
	hellomod "github.com/donvito/hellomod"
	hellomodV2 "github.com/donvito/hellomod/v2"
)

func main() {
	hellomod.SayHello()
	hellomodV2.SayHello("Melvin")
}

 

Bài viết được tham khảo tại đây.

Hẹn gặp lại. Hy vọng bài viết này có ích đối với các bạn.