<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Lattapon Yodsuwan</title>
    <description>The latest articles on Forem by Lattapon Yodsuwan (@bylatt).</description>
    <link>https://forem.com/bylatt</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F436%2FiF0H2VWy.jpeg</url>
      <title>Forem: Lattapon Yodsuwan</title>
      <link>https://forem.com/bylatt</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/bylatt"/>
    <language>en</language>
    <item>
      <title>Bundle static file to Go binary</title>
      <dc:creator>Lattapon Yodsuwan</dc:creator>
      <pubDate>Mon, 13 Jul 2020 17:32:13 +0000</pubDate>
      <link>https://forem.com/bylatt/bundle-static-file-to-go-binary-55jj</link>
      <guid>https://forem.com/bylatt/bundle-static-file-to-go-binary-55jj</guid>
      <description>&lt;p&gt;ใครที่เขียน Go มาสักพักจะรู้ว่า Go มันสามารถ build ได้ง่ายและเร็วมากๆ เพียงแค่ใช้คำสั่ง &lt;code&gt;go build&lt;/code&gt; เราก็จะได้ binary ที่สามารถเอาไป deploy หรือใช้งานได้ทันที&lt;/p&gt;

&lt;p&gt;แต่บ่อยครั้งที่ app ของเราต้องการใช้ file อื่นๆ ด้วย เช่น view engine หรือ config file ต่างๆ ทำให้ในการใช้งานเราต้อง copy file เหล่านั้นไปพร้อมๆ กับ binary ของ Go ที่ build มาแล้วด้วย เพื่อให้ app ทำงานได้ถูกต้อง&lt;/p&gt;

&lt;p&gt;แต่ก็มีวิธีง่ายๆ ที่ทำให้เราสามารถเพิ่ม file ที่ต้องการเข้าไปใน Go binary เพื่อความสะดวกในการ deploy โดยใช้ package &lt;a href="https://github.com/markbates/pkger" rel="noopener noreferrer"&gt;&lt;code&gt;pkger&lt;/code&gt;&lt;/a&gt; มาช่วย&lt;/p&gt;

&lt;h2&gt;
  
  
  ตัวอย่างการเพิ่ม static file ไปใน Go binary
&lt;/h2&gt;

&lt;p&gt;สมมติว่าเรามี app ที่ serve html และมี directory structure แบบด้านล่าง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.
├── go.mod
├── go.sum
├── main.go
└── views
   └── index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;เริ่มจากการ install &lt;code&gt;pkger&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;go get github.com/markbates/pkger/cmd/pkger
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;และ initial &lt;code&gt;pkger&lt;/code&gt; ใน project ของเราด้วยคำสั่ง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pkger
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;หลังจากนั้นจะมี file pkged.go เพิ่มเข้ามาใน project ของเรา&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.
├── go.mod
├── go.sum
├── main.go
├── pkged.go &amp;lt;- this file
└── views
   └── index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pkger -include /views
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ใน &lt;code&gt;main.go&lt;/code&gt; เราสามารถอ่าน file html ใน directory views ด้วย package &lt;code&gt;pkger&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// 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(&amp;amp;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))
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;จากนั้น build binary&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;go build -o app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

</description>
      <category>go</category>
    </item>
  </channel>
</rss>
