user3918985
user3918985

Reputation: 4429

Go: embed JS files with bindata

This question is a follow up to an earlier question of mine. I've closed the question so I hope its okay that I ask a fresh but related question here. Go: embed static files in binary

How do I serve JS files with go-bindata? Do I pass it into html like this

hi.html

<script>{{.Bindata}}></script>

Doesn't seem to work even though I have no compile or JS errors.

Upvotes: 2

Views: 1908

Answers (3)

Dan Esparza
Dan Esparza

Reputation: 28385

Using https://github.com/elazarl/go-bindata-assetfs

Assuming you have the following structure:

myprojectdirectory
├───api
├───cmd
├───datastores
└───ui
    ├───css
    └───js

Where ui is the directory structure you'd like to wrap up and pack into your app...

Generate a source file

The go-bindata-assetfs tool is pretty simple. It will look at the directories you pass to it and generate a source file with variables that can contain the binary data in those files. So make sure your static files are there, and then run the following command from myprojectdirectory:

go-bindata-assetfs ./ui/...

Now, by default, this will create a source file in the package main. Sometimes, this is ok. In my case, it isn't. You can generate a file with a different package name if you'd like:

go-bindata-assetfs.exe -pkg cmd ./ui/...

Put the source file in the correct location

In this case, the generated file bindata_assetfs.go is created in the myprojectdirectory directory (which is incorrect). In my case, I just manually move the file to the cmd directory.

Update your application code

In my app, I already had some code that served files from a directory:

import (
    "net/http"
    "github.com/gorilla/mux"
)

// Create a router and setup routes
var Router = mux.NewRouter()    
Router.PathPrefix("/ui").Handler(http.StripPrefix("/ui", http.FileServer(http.Dir("./ui"))))

// Start listening
http.ListenAndServe("127.0.0.1:3000", Router)

Make sure something like this works properly, first. Then it's trivial to change the FileServer line to:

Router.PathPrefix("/ui").Handler(http.StripPrefix("/ui", http.FileServer(assetFS())))

Compile the app

Now you have a generated source file with your static assets in them. You can now safely remove the 'ui' subdirectory structure. Compile with

go install ./...

And you should have a binary that serves your static assets properly.

Upvotes: 2

user3918985
user3918985

Reputation: 4429

Got my answer here: Unescape css input in HTML

var safeCss = template.CSS(`body {background-image: url("paper.gif");}`)

Upvotes: 0

jmaloney
jmaloney

Reputation: 12310

Use https://github.com/elazarl/go-bindata-assetfs

From the readme:

go-bindata-assetfs data/...

In your code setup a route with a file server

http.Handle("/", http.FileServer(assetFS()))

Upvotes: 0

Related Questions