Acquis 19 - Standalone Binaries
Lus can bundle scripts and their dependencies into the interpreter executable itself, creating standalone binaries that run without external files.
Basic Usage
Use --standalone to create a standalone executable from a script:
lus --standalone app.lus
This creates an executable named app (or app.exe on Windows) that runs the bundled script when executed.
./app
Including Files
Use --include to bundle additional files that can be require()d at runtime:
lus --standalone app.lus --include lib/utils.lus --include lib/config.lus
The bundled modules are available via their derived module names:
-- app.lus
local utils = require("utils") -- loads bundled lib/utils.lus
local config = require("config") -- loads bundled lib/config.lus
Module Aliases
Use the :alias syntax to specify a custom module name:
lus --standalone app.lus --include vendor/json.lus:json
-- app.lus
local json = require("json") -- loads bundled vendor/json.lus
Including Directories
Entire directories can be included, with files recursively bundled using dot-notation module names:
lus --standalone app.lus --include lib
-- app.lus
local http = require("lib.http") -- loads lib/http.lus
local utils = require("lib.utils") -- loads lib/utils.lus
local sub = require("lib.sub.module") -- loads lib/sub/module.lus
Only .lus and .lua files are included from directories.
Module Resolution
When require() is called, bundled modules are checked before the filesystem, which take precedence over same-named files in the working directory.
Preserved Arguments
CLI flags like -P and -W are automatically preserved in the bundle and applied at runtime:
lus --standalone app.lus -Pfs -Pnetwork
./app # runs with fs and network permissions
Runtime Arguments
Arguments passed to the standalone binary are available via the arg table and ...:
./app foo bar baz
-- app.lus
print(arg[0]) -- "./app"
print(arg[1]) -- "foo"
print(arg[2]) -- "bar"
print(...) -- "foo", "bar", "baz"