lualike_hooks
lualike_hooks is the build-hook package for compiling Lua scripts as part of a Dart or Flutter build.
It supports three output strategies:
| Mode | Output | Best for |
|---|---|---|
CompileMode.bytecode |
build/<dir>/*.lua |
simplest runtime loading, Flutter assets, Dart CLI files |
CompileMode.dartSource |
build/<dir>/*.lua.dart |
generating Dart source from Lua logic |
CompileMode.dartEmbed |
build/<dir>/*.lua.dart |
embedding bytecode bytes into Dart source |
When to use which mode
- Use
bytecodewhen you want the most straightforward setup. Compile at build time, ship the bytecode, and execute it withLuaBytecodeRuntime. When data assets are enabled, the hook also emits aDataAssetthatdart build clicopies beside the executable inassets/. - Use
dartSourcewhen you want generated Dart code instead of a bytecode asset pipeline. - Use
dartEmbedwhen you want the bytecode bytes embedded as Dart constants (no separate asset files).
Quick start
1) Add dependencies
For a Dart package:
dependencies:
lualike: ^0.4.0
dev_dependencies:
lualike_hooks:
path: path/to/lualike_hooks
hooks: ^2.0.2
For Flutter, prefer flutter_lualike which re-exports the hooks API.
2) Add hook/build.dart
import 'package:hooks/hooks.dart';
import 'package:lualike_hooks/lualike_hooks.dart';
void main(List<String> args) async {
await build(args, (input, output) async {
final builder = LuaBuilder(
sources: ['lua/'],
mode: CompileMode.bytecode,
);
await builder.run(input: input, output: output, logger: null);
});
}
3) Put Lua files in your source directory
your_package/
lua/
hello.lua
math/util.lua
hook/
build.dart
bin/
main.dart
4) Load at runtime
import 'package:lualike/lualike.dart';
Future<void> main() async {
final loader = LuaAssetLoader();
final bytecode = await loader.loadBytecode('hello.lua');
if (bytecode == null) return;
final runtime = LuaBytecodeRuntime();
final chunk = await runtime.loadBytecode(bytecode, moduleName: 'hello.lua');
await runtime.callFunction(chunk, const <Object?>[]);
}
Bytecode mode
This is the default mode.
Flutter
Declare the compiled directory as an asset:
flutter:
assets:
- build/lua/
Load the file with rootBundle:
import 'package:flutter/services.dart';
final data = await rootBundle.load('build/lua/hello.lua');
final bytes = data.buffer.asUint8List();
Dart CLI
Use LuaAssetLoader (it also checks bundled data assets):
final loader = LuaAssetLoader();
final bytes = await loader.loadBytecode('hello.lua');
Dart source mode
const builder = LuaBuilder(
sources: ['lua/'],
mode: CompileMode.dartSource,
);
This mode generates .dart files containing lowered Lua logic as Dart code.
Use it when you want the generated source to be imported directly.
Dart embed mode
const builder = LuaBuilder(
sources: ['lua/'],
mode: CompileMode.dartEmbed,
);
This mode generates .dart files containing a List<int> of bytecode bytes.
Use it when you want bytecode execution without separate asset files.
Builder options
const builder = LuaBuilder(
sources: ['lua/'],
mode: CompileMode.bytecode,
outputDirName: 'lua',
enableConstantFolding: true,
enablePeephole: true,
stripDebug: false,
);
Flutter integration
If you are building a Flutter app, the easiest path is:
- depend on
flutter_lualike - import
package:flutter_lualike/hooks.dartinhook/build.dart - import
package:flutter_lualike/flutter_lualike.dartat runtime
// hook/build.dart
import 'package:flutter_lualike/hooks.dart';
void main(List<String> args) async {
await build(args, (input, output) async {
final builder = LuaBuilder(sources: ['assets/lua/']);
await builder.run(input: input, output: output, logger: null);
});
}
// runtime
import 'package:flutter_lualike/flutter_lualike.dart';
await useAssetBundle(rootBundle, assetRoot: 'build/lua');
Examples
| Example | Mode | Notes |
|---|---|---|
examples/example_dart/ |
bytecode | Dart CLI end-to-end |
examples/example_dart_data_assets/ |
bytecode | Dart CLI + experimental DataAssets |
Libraries
- lualike_hooks
- Build hook for compiling Lua scripts at build time.