moonstone
- title
- moonstone
- type
- toolbox
- summary
- Менеджер пакетов и окружений для Lua на Zig с lockfile'ами и контентно-адресуемым хранилищем
- tags
- zig, lua, package-manager, reproducible-builds, watchlist
- language
- Zig
- license
- Apache-2.0
- created
- 2026-07-18
- updated
- 2026-07-18
- lang
- ru
- translation_of
- moonstone
- source_updated
- 2026-07-18
- translated
- 2026-09-01
- translator
- lllm/antigravity/gemini-3.7-flash-medium
Moonstone - это менеджер окружений и пакетов для Lua, написанный на zig. Он устанавливает и выбирает интерпретаторы семейства Lua (PUC Lua или LuaJIT), разрешает зависимости и собирает пакеты, проверяет совместимость ABI в Lua и создаёт изолированные окружения для проектов на базе контентно-адресуемого хранилища. Автор отдельно уточняет частую ошибку в понимании заголовка на HN: это не новая виртуальная машина Lua на Zig. Ближайшая ментальная модель - это LuaRocks плюс изолированные проектные окружения, lockfile, нативная сборка силами Zig и workspace'ы с несколькими интерпретаторами. Точка входа в CLI - команда moon.
Как это устроено
Основная проблема, которую он решает, - типичные поломки окружения в Lua: вы клонируете проект, запускаете его и сталкиваетесь с отсутствующей нативной зависимостью, несовпадением версий (локальная Lua 5.4 против кодовой базы под LuaJIT 2.1) или с LUA_PATH, засорённым артефактами других проектов. Lua намеренно остаётся минималистичной и перекладывает управление окружением на хост. Moonstone переносит эту ответственность в отдельный инструмент.
Всё завязано на глобальное контентно-адресуемое хранилище (CAS). Файлы пакетов лежат в режиме read-only в ~/.local/share/moonstone/ и шардируются по своему BLAKE3-хешу в store/v0/b3/<h0h1>/<h2h3>/<full-hash>-<name>-<version>/. Каждый сохранённый артефакт содержит manifest.toml, декларирующий всё, что он предоставляет - имена бинарников для CLI, точки входа модулей Lua, модули на C, - благодаря чему компоновщик знает, что именно проецировать в окружение. База данных SQLite в index/v0/index.sqlite кэширует индекс реестра, описания пакетов и пути к shim'ам для ускорения работы солвера.
Проект описывается двумя файлами. moonstone.toml - это декларативный манифест: метаданные, требования к интерпретатору в секции [interpreter], скрипты и пакеты в [[dependencies]]. moonstone.lock фиксирует результат разрешения зависимостей - точные версии, хеши исходников, целевые ABI и рецепты компилятора/материализатора для сборки нативных модулей. Команда moon sync считывает lockfile и материализует локальную для проекта директорию .moonstone/env/, создавая симлинки на нужный интерпретатор и файлы пакетов прямо из глобального CAS. Поскольку хранилище общее и доступно только для чтения, а само окружение состоит из симлинков, несколько проектов используют одну и ту же копию артефакта, оставаясь полностью изолированными друг от друга.
Зависимости приходят из нескольких resolver'ов, которые выбираются по префиксу: простое имя (moon add inspect) обращается к реестру по умолчанию, rocks:lua-cjson подтягивает пакет из LuaRocks, path:../my-lib берёт локальную директорию, а link:my-lib использует зарегистрированную ссылку. Нативные C-модули собираются через zig cc (на базе LLVM) по собственным герметичным рецептам Moonstone, однако сборка существующих пакетов LuaRocks всё ещё опирается на системный GNU toolchain, поскольку такие пакеты поставляются с makefile'ами и рецептами сборки под GCC. Автор преподносит это как осознанный компромисс ради совместимости, а не как целевой путь: предпочтение отдаётся именно нативным герметичным рецептам через zig cc.
Бинарник moon и проектные окружения версионируются раздельно. Команды moon install --latest или --version 0.1.1 управляют версией самого CLI, moon setup восстанавливает глобальные shim'ы, а moon interpreter remove lua@5.4.7 удаляет неиспользуемый артефакт интерпретатора (с флагом --target <triple>, если совпадает несколько целевых сборок, и --force, если рантайм всё ещё выбран глобально или используется в проекте). Хранилище следует соглашениям XDG Base Directory, которые можно переопределить через глобальный config.toml или переменные окружения MOONSTONE_CONFIG / MOONSTONE_DATA / MOONSTONE_CACHE / MOONSTONE_HOME.
Два родственных проекта расширяют его возможности: Ballad упаковывает окружение в единый бинарный файл, а Meteorite компилирует нативные сервисы. Moonstone намеренно использует тематические названия (orbits, Ballad) как общий язык дизайна; автор признаёт, что документации не хватает более понятного вводного слоя для тех, кто видит проект впервые.
Использование
# initialize a project
moon init . --name my-app --kind script --interpreter lua@5.4
# add dependencies from different resolvers
moon add inspect
moon add rocks:lua-cjson # LuaRocks
moon add path:../my-lib # local path
moon add link:my-lib # registered link
# materialize the project-local environment from the lockfile
moon sync
# run
moon run dev
moon exec lua src/main.lua
Ограничения
Только POSIX - Linux и macOS, без Windows, несмотря на пометку "cross-platform" (здесь это означает поддержку нескольких архитектур и ABI, а не любых платформ). Для сборки требуется Zig 0.16.0 и набор системных утилит: gcc, make, cmake, tar, curl, zstd, sqlite3. Поэтому утверждение об "отсутствии рантайм-зависимостей" относится только к самому скомпилированному бинарнику, но не к процессу сборки сторонних пакетов LuaRocks, который всё ещё требует GNU toolchain. Проект находится на ранней стадии и, по словам автора, активно и сумбурно перерабатывается: контракты API, флаги CLI и конфигурация меняются по мере того, как автор пишет на этой связке проекты на Lua+Zig. Значительная часть документации сгенерирована ИИ - автор называет это вынужденной мерой, чтобы успевать за быстро меняющимся кодом, и открыто просит помочь переписать её более живым языком, что и вызвало основную критику на HN. Это один из нескольких свежих инструментов для окружений Lua; ближе всего по части управления пакетами к нему находится Lux, а фиксацию версий интерпретатора для ряда задач уже закрывают Nix, mise, asdf и hererocks.
Отслеживается в watchlist - молодой проект от одного автора, под одну группу платформ и всё ещё до версии 1.0.
Связанные страницы: zig, comptime.
Репозиторий: https://github.com/moonstone-sh/moonstone - 29 звёзд, Apache-2.0.