Ai code golang hẳn đã quen với việc viết một đoạn code, chạy server (nhiều khả năng gõ hẳn câu lệnh go run main.go) và xem kết quả. Sau đấy khi cần phải chỉnh sửa một đoạn code nhỏ để xem lại kết quả thì phải tắt server đi rồi bật lại. Đối với những project lớn sử dụng database, redis, các framework iris hay fiber thì mỗi lần tắt đi bật lại phải đợi chương trình chạy kết nối hết tất cả những thứ trên. Thời gian phải chạy server, nhân với số lần chỉnh sửa liên tục, đã tiêu tốn của ta rất nhiều. May thay golang cung cấp cho ta package realize có thể bắt được sự kiện mỗi lúc ta chỉnh sửa file có đuôi .go trong project và biến thành live server.

1. Cài đặt

Như cài đặt vô số package khác để dùng cho project, realize cũng dùng câu lệnh cài đặt tương tự trên terminal

go get github.com/oxequa/realize

Trường hợp ta gặp phải lỗi sau:

Thì có thể thêm dòng lệnh vào trong file go.mod:

replace gopkg.in/urfave/cli.v2 => github.com/urfave/cli/v2 v2.2.0

Lưu ý: cần đặt câu trên bên ngoài require()
Rồi chạy lại câu lệnh cài đặt go get github.com/oxequa/realize.

2. Khởi chạy

Bước tiếp theo gõ câu lệnh sau:

~/go/bin/realize start

Kết quả chạy ra:

Ở đây realize đang quan sát tổng cộng 62 file có đuôi .go trên tổng số 368 folder trong project. Giờ một sự thay đổi bất kỳ ở một trong 62 file .go

Realize nhận ra ngay và thông báo ra bên ngoài.

Tuy nhiên đây chưa phải kết quả mong muốn, vì ở đây mới chỉ bắt sự kiện mỗi khi thay đổi trong file, ta cần phải tự động chạy server mỗi khi có sự thay đổi.

3. Chỉnh sửa file .realize.yaml

Một điều chưa nhắc đến đó là sau khi ta gõ câu lệnh start realize trên thì nó sẽ tự động sinh ra file .realize.yaml. File sẽ có cấu trúc như sau:

settings:
  legacy:
    force: false
    interval: 0s
schema:
- name: #tên folder project ở đây
  path: .
  commands: {}
  watcher:
    extensions:
    - go
    paths:
    - /
    ignore:
      paths:
      - .git
      - .realize
      - vendor

Đọc file trên có thể hiểu cấu hình của nó: theo dõi các file .go, ignore các file .git,.realize,vendor. Nhưng tất cả mới chỉ dừng lại ở đó, ta cần cấu hình để cho chương trình tự động chạy mỗi khi thay đổi file .go bằng cách gõ dòng lệnh vào trong commands.

settings:
  legacy:
    force: false
    interval: 0s
schema:
- name: #tên folder project ở đây
  path: .
  commands: 
    install:
      status: true
      method: go build -o tmp/app.out main.go
    run:
      status: true
      method: tmp/app.out
  watcher:
    extensions:
    - go
    paths:
    - /
    ignore:
      paths:
      - .git
      - .realize
      - vendor

Project sẽ build folder tmp chứa thư mục app.out.

4. Kết quả

Giờ ta bắt đầu chạy ~/go/bin/realize start và thu được kết quả:

Giờ thử thay đổi file main.go bằng cách bổ sung dòng code fmt.Println("Hello world") vào đầu của hàm func main(){} và xem kết quả ngay tức khắc:

Không cần phải tắt server rồi gõ go run main.go để khởi chạy lại, chương trình đã tự động cập nhật và chạy đoạn code mới.