บางโปรเจคในภาษา Go เราอาจจะอยากเขียน lib ไว้แชร์ให้ทีมใช้ร่วมกัน
ในช่วงนี้ lib ตัวนี้ยังไม่คงที่ หรือยังคงมีของเติมเข้าไปอยู่เรื่อยๆ เนื่องจากเป็นช่วงตั้งไข่ หากเรากำหนด version ลงไปเลยตั้งแต่แรก เวลา upgrade ก็อาจจะยุ่งนิดหน่อย
โดยเฉพาะบางทีม รีบมากและอยากแยก repo เยอะๆ จะได้มีหลายๆทีมทำงานพร้อมๆกัน แต่ก็อยากใช้ lib ร่วมกันด้วย
สมมุติ ผมเริ่มด้วยการสร้าง lib กลางโง่ๆมาตัวหนึ่งแบบนี้
go.mod
module github.com/pallat/versioning
go 1.16
versioning.go
package versioning
var Number = 1
แล้วก็ commit ให้เรียบร้อยแล้ว push ขึ้นไปที่ github
จากนั้นก็ลองสร้างโปรเจ็คมาเรียกใช้ แบบนี้
main.go
package main
import (
"fmt"
"github.com/pallat/versioning"
)
func main() {
fmt.Println(versioning.Number)
}
เนื่องจากมี 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
ทีนี้ถ้าตัว lib กลางอยากเปลี่ยนค่า เป็นแบบนี้
package versioning
var Number = 2
คนที่มาเรียกใช้ 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)