One common source of production issues in Go services is filesystem dependency.
Applications often rely on:
- HTML templates
- Configuration JSON files
- Static assets
- Migration scripts
When these files are deployed separately from the binary, issues can arise:
- Incorrect working directories
- Missing files inside containers
- CI/CD packaging mistakes
- Environment inconsistencies
The Built-In Solution
Since Go 1.16, the embed package allows developers to compile static files directly into the binary using the //go:embed directive.
Example:
`import "embed"
//go:embed templates/*
var templates embed.FS`
When go build runs, the specified files are bundled into the executable.
Benefits
- Single deployable artifact
- Deterministic builds
- No runtime filesystem dependency
- Ideal for containerized environments
- Works well with scratch or distroless images
When Not to Use It
Embedding is not suitable for:
- Frequently changing configuration
- User-editable files
- Large media assets
A rebuild is required after any change.
Conclusion
Reducing external dependencies reduces operational complexity.
If a file is static and essential to application logic, embedding it improves portability and reliability.
In distributed systems, simplicity scales.
Top comments (0)