NOTE: This article was made before the rebrand to lde. Just replace
lpmwithlde.
Upgrade to the latest version with
lpm upgrade!
LuaRocks support
This is the big one. lpm can now install packages from the LuaRocks registry using the luarocks field in your lpm.json:
{
"dependencies": {
"luafilesystem": { "luarocks": "luafilesystem" },
"busted": { "luarocks": "busted" }
}
}
You can also add them from the CLI:
lpm add rocks:luafilesystem
lpx and lpm install support it too:
lpx rocks:luacheck
lpm install rocks:busted
busted

If a package has a rockspec in a git repo, you can point to it manually with the rockspec field:
{
"dependencies": {
"middleclass": {
"git": "https://github.com/kikito/middleclass",
"rockspec": "./rockspecs/middleclass-4.1.1-0.rockspec"
}
}
}
LuaRocks support includes C module compilation — lpm will download LuaJIT headers and compile native modules automatically. Platform-specific modules are handled too.
This is an initial implementation. Things may not work perfectly across all packages — if you run into issues, please report them.
Archive dependencies
You can now install dependencies directly from a .zip or tarball URL:
{
"dependencies": {
"foo": { "archive": "https://example.com/foo.zip" }
}
}
Flat lockfile for transitive dependencies
Previously, transitive dependencies weren’t always tracked reliably. Now lpm stores all dependencies - direct and transitive - flat in a single lockfile. This is how it was always intended to work, and it makes installs more deterministic and conflict-free.
Basic REPL
Running lpm repl drops you into an interactive Lua session with your project’s dependencies available:
lpm repl

New lpm-test utilities
A few more additions to the test framework:
test.skip() -- unconditionally skip a test
test.skipIf(cond) -- skip if condition is true
test.deepEqual(a, b) -- deep equality check
test.match(str, pat) -- pattern match assertion
Skipped tests are now printed separately in the output.