GitHub - rakyll/statik: Embed files into a Go executable
source link: https://github.com/rakyll/statik
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
statik
statik allows you to embed a directory of static files into your Go binary to be later served from an http.FileSystem.
Is this a crazy idea? No, not necessarily. If you're building a tool that has a Web component, you typically want to serve some images, CSS and JavaScript. You like the comfort of distributing a single binary, so you don't want to mess with deploying them elsewhere. If your static files are not large in size and will be browsed by a few people, statik is a solution you are looking for.
Usage
Install the command line tool first.
go get github.com/rakyll/statik
statik is a tiny program that reads a directory and generates a source file that contains its contents. The generated source file registers the directory contents to be used by statik file system.
The command below will walk on the public path and generate a package called statik
under the current working directory.
$ statik -src=/path/to/your/project/public
The command below will filter only files on listed extensions.
$ statik -include=*.jpg,*.txt,*.html,*.css,*.js
In your program, all your need to do is to import the generated package, initialize a new statik file system and serve.
import (
"github.com/rakyll/statik/fs"
_ "./statik" // TODO: Replace with the absolute import path
)
// ...
statikFS, err := fs.New()
if err != nil {
log.Fatal(err)
}
// Serve the contents over HTTP.
http.Handle("/public/", http.StripPrefix("/public/", http.FileServer(statikFS)))
http.ListenAndServe(":8080", nil)
Visit http://localhost:8080/public/path/to/file to see your file.
You can also read the content of a single file:
import (
"github.com/rakyll/statik/fs"
_ "./statik" // TODO: Replace with the absolute import path
)
// ...
statikFS, err := fs.New()
if err != nil {
log.Fatal(err)
}
// Access individual files by their paths.
r, err := statikFS.Open("/hello.txt")
if err != nil {
log.Fatal(err)
}
defer r.Close()
contents, err := ioutil.ReadAll(r)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(contents))
There is also a working example under example directory, follow the instructions to build and run it.
Note: The idea and the implementation are hijacked from camlistore. I decided to decouple it from its codebase due to the fact I'm actively in need of a similar solution for many of my projects.
Deterministic output
By default, statik includes the "last modified" (mtime) time on files that it packs. This allows an HTTP FileServer to present the correct file modification times to clients.
However, if you have a continuous integration task that checks that your checked-in static files in a git repository match the code that is generated on your CI system, you'll run into a problem: The mtime on the git checkout does not match what you have locally, causing tests to fail.
You can fix the test in one of two ways:
- In CI, manually set the mtime on the freshly checked out tree: here's a stackoverflow answer that provides a shell command to do that; or,
- Instruct statik not to store the "last modified" time.
To ignore the last modified time, use the -m
to statik, like so:
$ statik -m -include=*.jpg,*.txt,*.html,*.css,*.js
Note that this will cause http.FileServer to consider the file to always have changed & serve it with a "Last-Modified" of the time of the request.
Recommend
-
74
README.md autopprof Pprof made easy at development time. Guide Add autopprof.Capture to your main function. import
-
36
README.md gotest Like go test but with colors. Installation $ go get -u github.com/rakyll/gotest
-
76
Deploying an SPA as a Go Binary Using Webpack and Statik It’s no secret that I’ve been doing a lot of Go work recently and dabbling with some Vue.js here and there. While there are many guides on how to build a single page web...
-
29
Background and motivation My co-workers and I are busy preparing the latest release of CockroachDB , version 19.1. CockroachDB is released as a single program exec...
-
5
IntroductionTwo years ago, my article"Why are my Go executable files so large?"...
-
21
The Ape Programming Language About Ape is an easy to use programming language and library written in C. It's an offspring of Monkey language (from
-
7
Embedding static files in a go binary using go embedStarting with Golang 1.16, file embedding is supported in Go without the need of an external package. I have been using packages like
-
3
Embed Read-Only Files in Go Code May 03, 2018 The motivation is to embed da...
-
2
PDF files are a very popular way of sharing formatted documents due to their flexibility and lightweight nature—they work on most devices and operating systems. In this post, I'll show you how to use a WordPress PDF plugin to embed and prot...
-
6
A Guide to Embedding Static Files in Go using go:embedMar 21, 2023 • 4 min read • #cli...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK