DEV Community

Lattapon Yodsuwan
Lattapon Yodsuwan

Posted on

Bundle static file to Go binary

#go

ใครที่เขียน 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
Enter fullscreen mode Exit fullscreen mode

เริ่มจากการ install pkger

go get github.com/markbates/pkger/cmd/pkger
Enter fullscreen mode Exit fullscreen mode

และ initial pkger ใน project ของเราด้วยคำสั่ง

pkger
Enter fullscreen mode Exit fullscreen mode

หลังจากนั้นจะมี file pkged.go เพิ่มเข้ามาใน project ของเรา

.
├── go.mod
├── go.sum
├── main.go
├── pkged.go <- this file
└── views
   └── index.html
Enter fullscreen mode Exit fullscreen mode

จากนั้นเพิ่ม static file ที่ต้องการ bundle เข้าไปใน binary ด้วยคำสั่ง

pkger -include /views
Enter fullscreen mode Exit fullscreen mode

ใน 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))
}
Enter fullscreen mode Exit fullscreen mode

จากนั้น build binary

go build -o app
Enter fullscreen mode Exit fullscreen mode

เราจะได้ binary app ที่มี static file bundle เข้าไปด้วย สามารถนำไปใช้งานได้เลย

Top comments (0)