0
votes

I'd like to have a single binary for a go-app, rather than having to bundle static files alongside the deployment.

I'm using a function like this to access PNGs I'm loading:

func getFileList(dir string) (fileList []os.FileInfo, err error) {
    // USAGE: 
    //    fileList,_ := getFileList(PNG_DIR)
    f, err := os.Open(PNG_DIR)
    defer f.Close()
    checkErr(err)
    fileList, err = f.Readdir(0)
    checkErr(err)
    return fileList, err
}

I take this list of files and serve it on a static endpoint, with some logic.

I have read the following documentation for using go-assets

As well as this gin specific example:

Which contains the following example:

Prepare Packages

go get github.com/gin-gonic/gin go get github.com/jessevdk/go-assets-builder

Generate assets.go

go-assets-builder html -o assets.go

Build the server

go build -o assets-in-binary

Run

./assets-in-binary

However, it's not clear to me how to call this file I have built. For example, What do I change in my getFileList() function to now point to whatever I built in the binary, what is it even called and how would I know that?

1

1 Answers

1
votes

Usually on gin you would use router.Statuc(path, dir) however you said you first load a list of files and I guess you will later use http.ServeFile.

With go-bindata you have all the files already inside the executable, you can access them using the Asset(file) function...

Basically this is a very simple static handler for gin:

func StaticHandler(c *gin.Context) {
      p := c.Param("filepath")
      data, err := Assets(p)
      if err != nil { return }
      c.Writer.Write(data)
}

You can register the static handler into your router:

router.GET("/static/*filepath", StaticHandler)

This allows to access static resources the following way: /static/css/style.css and will load the file css/style.css

You could get the list of files inside your folder, create a map and use that map for the static handler (to limit what files are accesed)