Files
embedfs/README.md
T
2026-05-05 23:02:06 +03:00

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.