DEV Community

Pallat Anchaleechamaikorn
Pallat Anchaleechamaikorn

Posted on

Go versioning

บางโปรเจคในภาษา Go เราอาจจะอยากเขียน lib ไว้แชร์ให้ทีมใช้ร่วมกัน
ในช่วงนี้ lib ตัวนี้ยังไม่คงที่ หรือยังคงมีของเติมเข้าไปอยู่เรื่อยๆ เนื่องจากเป็นช่วงตั้งไข่ หากเรากำหนด version ลงไปเลยตั้งแต่แรก เวลา upgrade ก็อาจจะยุ่งนิดหน่อย

โดยเฉพาะบางทีม รีบมากและอยากแยก repo เยอะๆ จะได้มีหลายๆทีมทำงานพร้อมๆกัน แต่ก็อยากใช้ lib ร่วมกันด้วย

สมมุติ ผมเริ่มด้วยการสร้าง lib กลางโง่ๆมาตัวหนึ่งแบบนี้

go.mod

module github.com/pallat/versioning

go 1.16
Enter fullscreen mode Exit fullscreen mode

versioning.go

package versioning

var Number = 1
Enter fullscreen mode Exit fullscreen mode

แล้วก็ commit ให้เรียบร้อยแล้ว push ขึ้นไปที่ github
จากนั้นก็ลองสร้างโปรเจ็คมาเรียกใช้ แบบนี้
main.go

package main

import (
    "fmt"

    "github.com/pallat/versioning"
)

func main() {
    fmt.Println(versioning.Number)
}
Enter fullscreen mode Exit fullscreen mode

เนื่องจากมี external dependencies ให้ใช้ go get

go mod init github.com/pallat/multiver
go get github.com/pallat/versioning

เราก็จะได้ไฟล์ go.mod หน้าตาประมาณนี้

go.mod

module github.com/pallat/multiver

go 1.16

require github.com/pallat/versioning v0.0.0-20210711103217-5a8cada9b2f5 // indirect
Enter fullscreen mode Exit fullscreen mode

ทีนี้ถ้าตัว lib กลางอยากเปลี่ยนค่า เป็นแบบนี้

package versioning

var Number = 2
Enter fullscreen mode Exit fullscreen mode

คนที่มาเรียกใช้ lib ตัวนี้ ก็อยากได้ค่าล่าสุดเหมือนกัน พอไป googling ดู เขาก็บอกว่า ลองแบบนี้ดูสิ

go get github.com/pallat/versioning@latest

ซึ่งพอลองแล้ว ในกรณีนี้มันไม่เปลี่ยน ก็เลยต้องเปลี่ยนวิธี โดยใช้การระบุ version ซึ่งกรณีนี้ lib ของเรายังไม่ได้ทำ versioning จริงจัง ตอนนี้มันก็เลยใช้เลข commit แทนไปก่อน เราก็เลยต้องทำแบบนี้

go get github.com/pallat/versioning@ec81430

แล้วลองรันดู

go run main.go
2

ได้ผลลัพธ์ที่เปลี่ยนไปโดยใช้ค่าใหม่จาก lib versioning ของเรา

โดย Go ใช้การบริหาร version แบบ SemVer เพราะฉะนั้นถ้า lib เริ่มนิ่งแล้วก็ควรเริ่มทำ version จริงจังได้แล้ว ถ้ามีการแก้ไขแล้วทำให้เกิด incompatible ก็ควร up major version ด้วยเหมือนกัน

Top comments (0)