1.8 KiB
Embedding Directories into Executables
The $embed_file() call in V embeds only a single file. This module makes it
easy to embed entire directories into the final executable.
File embedding in V is done at compile time, and there is no way to dynamically
embed arbitrary files into an application. The embedfs module is a simple
code generator that creates a separate .v file with the code for embedding
files.
Installation
v install https://github.com/gechandesu/embedfs
Usage
For example you have following file structure:
./
├── src/
│ ├── assets/
│ │ ├── css/
│ │ │ └── style.css
│ │ └── js/
│ │ └── app.js
│ └── main.v
└── v.mod
Lets embed the assets directory.
Create embed_assets.vsh next to v.mod:
#!/usr/bin/env v
import os
import embedfs
os.chdir('src')!
assets := embedfs.generate('assets')!
os.write_file('assets_generated.v', assets)!
Run it:
v run embed_assets.vsh
Now you have src/assets_generated.v. Take a look inside it:
module main
const embed_files = {
'assets/css/style.css': $embed_file('assets/css/style.css')
'assets/js/app.js': $embed_file('assets/js/app.js')
}
You can use it in src/main.v in this way:
module main
fn main() {
style := unsafe { embed_files['assets/css/style.css'].to_string() }
println(style)
}
The map type is map[string]embed_file.EmbedFileData, see the
v.embed_file
module docs for details.
bin2v tool
Also there is v bin2v utility that generates the V modules with embedded
files. See:
v help bin2v
In contrast with embedfs, bin2v generates constants into which it writes files as fixed-length byte arrays.