0

Lộ trình học Golang (Phần 2)

Getting Started

Tóm tắt lại bài trước:

  1. 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.
  1. 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

image.png

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

image.png

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: image.png

$ go work init ./hello

Lệnh trên tạo file go.work cho workspace chứa module trong ./hello. image.png

image.png

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à: image.png

Giờ workspace đã bao gồm cả module example.com/hellogolang.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: image.png

Chỉnh sửa file hello image.png

Từ thư mục workspace, chạy:

$ go run ./hello
olleH 10642

image.png

  • 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

image.png

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


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí