ใครที่เขียน Go มาสักพักจะรู้ว่า Go มันสามารถ build ได้ง่ายและเร็วมากๆ เพียงแค่ใช้คำสั่ง go build
เราก็จะได้ binary ที่สามารถเอาไป deploy หรือใช้งานได้ทันที
แต่บ่อยครั้งที่ app ของเราต้องการใช้ file อื่นๆ ด้วย เช่น view engine หรือ config file ต่างๆ ทำให้ในการใช้งานเราต้อง copy file เหล่านั้นไปพร้อมๆ กับ binary ของ Go ที่ build มาแล้วด้วย เพื่อให้ app ทำงานได้ถูกต้อง
แต่ก็มีวิธีง่ายๆ ที่ทำให้เราสามารถเพิ่ม file ที่ต้องการเข้าไปใน Go binary เพื่อความสะดวกในการ deploy โดยใช้ package pkger
มาช่วย
ตัวอย่างการเพิ่ม static file ไปใน Go binary
สมมติว่าเรามี app ที่ serve html และมี directory structure แบบด้านล่าง
.
├── go.mod
├── go.sum
├── main.go
└── views
└── index.html
เริ่มจากการ install pkger
go get github.com/markbates/pkger/cmd/pkger
และ initial pkger
ใน project ของเราด้วยคำสั่ง
pkger
หลังจากนั้นจะมี file pkged.go เพิ่มเข้ามาใน project ของเรา
.
├── go.mod
├── go.sum
├── main.go
├── pkged.go <- this file
└── views
└── index.html
จากนั้นเพิ่ม static file ที่ต้องการ bundle เข้าไปใน binary ด้วยคำสั่ง
pkger -include /views
ใน main.go
เราสามารถอ่าน file html ใน directory views ด้วย package pkger
// main.go
package main
import (
"bytes"
"io"
"log"
"net/http"
"github.com/markbates/pkger"
)
func main() {
f, err := pkger.Open("/views/index.html")
if err != nil {
panic(err)
}
var b bytes.Buffer
_, err = io.Copy(&b, f)
if err != nil {
panic(err)
}
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/html")
w.WriteHeader(http.StatusOK)
w.Write([]byte(b.String()))
})
log.Fatal(http.ListenAndServe(":4000", nil))
}
จากนั้น build binary
go build -o app
เราจะได้ binary app
ที่มี static file bundle เข้าไปด้วย สามารถนำไปใช้งานได้เลย
Top comments (0)