Hướng dẫn sử dụng go module

Hôm nay gsviec sẽ chia sẽ các bạn một tip dùng go module, thì như các bạn biết kể từ phiên bản golang 1.11 và 1.12 đã tích hợp tính năng quản lý các dependency thông qua go module.

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. Bạn có thể kiểm tra các biến env trong golang qua lệnh sau:

$ go env
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/thien/.cache/go-build"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/home/thien/go"
GOPROXY=""
GORACE=""
GOROOT="/usr/local/go"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"

Demo

Để 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. Trong ví dụ này chúng tôi sẽ dùng framework echo. Để thêm vào một module bạn chỉ việc chạy lệnh sau:

thien at gsviec in ~/go/src/go-basic
$ go mod init github.com/labstack/echo
go: modules disabled inside GOPATH/src by GO111MODULE=auto; see 'go help modules'

Nếu lần đầu tiên bạn chạy sẽ

package main

import (
        "net/http"
        "github.com/labstack/echo/v4"
)

func main() {
        e := echo.New()
        e.GET("/", func(c echo.Context) error {
                return c.String(http.StatusOK, "Hello, module!")
        })
        e.Logger.Fatal(e.Start(":1323"))
}

bạn hãy thử test nó với dòng lệnh sau:

$ go run server.go 
go: finding github.com/labstack/echo/v4 v4.1.6
go: downloading github.com/labstack/echo/v4 v4.1.6
go: extracting github.com/labstack/echo/v4 v4.1.6
go: finding github.com/stretchr/testify v1.3.0
go: finding github.com/valyala/fasttemplate v1.0.1
go: finding github.com/labstack/gommon v0.2.9
go: finding github.com/dgrijalva/jwt-go v3.2.0+incompatible
go: finding golang.org/x/text v0.3.2
go: finding golang.org/x/net v0.0.0-20190607181551-461777fb6f67
go: finding golang.org/x/tools v0.0.0-20190608022120-eacb66d2a7c3
go: finding golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5
go: finding golang.org/x/sys v0.0.0-20190609082536-301114b31cce
go: finding github.com/valyala/bytebufferpool v1.0.0
go: finding golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed
go: finding github.com/mattn/go-isatty v0.0.8
go: finding github.com/mattn/go-colorable v0.1.2
go: finding github.com/stretchr/objx v0.2.0
go: finding github.com/pmezard/go-difflib v1.0.0
go: finding golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223
go: finding github.com/stretchr/objx v0.1.0
go: finding github.com/davecgh/go-spew v1.1.0
go: finding github.com/davecgh/go-spew v1.1.1
go: finding golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3
go: finding golang.org/x/sys v0.0.0-20190412213103-97732733099d
go: finding golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e
go: finding golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2
go: finding golang.org/x/text v0.3.0
go: finding golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a
go: finding golang.org/x/net v0.0.0-20190311183353-d8887717615a
go: finding golang.org/x/sync v0.0.0-20190423024810-112230192c58
go: downloading golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5
go: downloading github.com/labstack/gommon v0.2.9
go: extracting github.com/labstack/gommon v0.2.9
go: downloading github.com/mattn/go-isatty v0.0.8
go: downloading github.com/mattn/go-colorable v0.1.2
go: downloading github.com/valyala/fasttemplate v1.0.1
go: extracting github.com/mattn/go-colorable v0.1.2
go: extracting github.com/valyala/fasttemplate v1.0.1
go: downloading github.com/valyala/bytebufferpool v1.0.0
go: extracting github.com/mattn/go-isatty v0.0.8
go: downloading golang.org/x/sys v0.0.0-20190609082536-301114b31cce
go: extracting github.com/valyala/bytebufferpool v1.0.0
go: extracting golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5
go: downloading golang.org/x/net v0.0.0-20190607181551-461777fb6f67
go: extracting golang.org/x/sys v0.0.0-20190609082536-301114b31cce
go: extracting golang.org/x/net v0.0.0-20190607181551-461777fb6f67
go: downloading golang.org/x/text v0.3.2
go: extracting golang.org/x/text v0.3.2

   ____    __
  / __/___/ /  ___
 / _// __/ _ \/ _ \
/___/\__/_//_/\___/ v4.1.5
High performance, minimalist Go web framework
https://echo.labstack.com
____________________________________O/_______
                                    O\
⇨ http server started on [::]:1323

như bạn thấy thì nó tự động pull code của framework echo về, nếu bạn truy cập localhost:1323 bạn sẽ thấy đoạn text Hello, module!, thông thường thì chúng ta sẽ commit luôn thư mục vendor, do đó để tạo thư mục này bạn chạy lệnh sau:

thien at gsviec in ~/go/src/go-basic
$ go mod vendor
thien at gsviec in ~/go/src/go-basic
$ ls
echo  go.mod  go.sum  server.go  vendor
thien at gsviec in ~/go/src/go-basic

Kết luận

Trong bài viết này gsviec đã chia sẽ cho các bạn một tip sử dụng go module, huy vọng các bạn thấy hữu ích, như mọi khi nếu thấy hay hãy chia sẽ cho mọi người nhé.

CC hình ảnh: https://www.youtube.com/watch?v=-2BMNjGr2B0

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *