Исходник moonly / super-demo implementation of MoonLoader`s package manager

Musaigen

abobusnik
Автор темы
Проверенный
1,597
1,356
moonly - скрипт (a.k.a библиотека, a.k.a супер-кастрированный package-manager типа Cargo и подобных, но для MoonLoader), который подойдёт для разработчиков больших скриптов от 1000 строк и выше (хотя такое условие не обязательно).

Суть: вместо написания одного скрипта в папке moonloader, moonly предлагает свою идентичную папку в корне игры, где термин "MoonLoader" скрипт меняется на "MoonLoader" проект. То есть для каждого скрипта/пакета/проекта создаётся своя директория, а в ней обязательный файл project.json (в него можно ничего не писать, но он должен присутствовать), который указывает поддиректорию с исходниками (src по умолчанию) и кастомными библиотеками (lib по умолчанию). В папке с исходниками создаётся скрипт init.lua, который будет загрузчиком для всего остального и является обязательным.

Плюсы:
  1. Удобство: лишние файлы больше не будут мозолить глаза при разработке (например, открыл в VSCode папку moonloader, где у тебя установлено 1000 аризона хелперов). Настроить IntelliSense (вроде Lua LS) несложно, достаточно добавить директории с исходниками и библиотеками в "Lua.runtime.path".
  2. Модульность: особенно актуально для скриптов с кол-вом строк от 1000 и выше. Реализацию скрипта можно растаскать по папкам и классам, оставив главный файл (init.lua) чисто как загрузчик.
  3. Git, LuaRocks: за счет реализации, moonly вполне удобен при работе с Git и LuaRocks (хоть это и не тестировалось)
Минусы:
  1. Сильной разницы между реализацией нативно (см. RakLogger, RakEmulator, NS и другие подобные проекты) и через moonly - нет. Moonly не привносит своей реализации менеджера зависимостей, вроде deps. Однако в случае релиза стабильной версии 0.27 (и выше) версии MoonLoader, deps вполне неплохо может дополнить moonly, при этом не нарушая совместимость с обычными MoonLoader скриптами. В общем - подойдёт побаловаться на один вечер, либо использовать как среду для написания своих MoonLoader проектов, слегка изменяя структуру архива перед выгрузкой на Blasthack. (Теперь есть command-line-tool, который сам всё изменит). Третий вариант - как идея/референс/motivation/power для чего-то большего.
Зависимости: LuaFileSystem
GitHub: click
Установка: Скачать с GitHub архив либо по прямой ссылке, moonly.lua из папки src поместить в папку moonloader.
Как воспринимать moonly: в данный момент - как подделку на Lua для моего собственного интереса, не более. В будущем - неизвестно.
Инструменты: moonly-command-tool (утилита для командной строки, которая прописывается в PATH системы). Получить инфо по всем командам --help

V0.1.1: Подсмотрев у FYP'a, реализовал AutoReboot, работает на все файлы в папке src (или как у вас будет называться в проекте), которые были в момент загрузки. Проверка на изменение файла происходит каждую 1 секунду. Изменить можно в коде moonly.lua. Теперь при выгрузке moonly, все проекты также будут выгружены.
V0.1.2: Реализован moonly-command-tool
V0.1.3:
moonly:
  1. Пропатчен getWorkingDirectory, теперь в проектах moonly он всегда будет возвращать папку с исходниками корневую директорию вашего проекта. Если нужно получить папку moonloader, используйте getMoonloaderDirectory, либо getGameDirectory() .. "\\moonloader". Функция getMoonloaderDirectory существует только в пределах moonly проекта.
  2. Добавлена функция getMoonlyVersion и константа MOONLY_VERSION (тоже самое). Добавлен флаг MOONLY_ENVIRONMENT (boolean) для проверки на нахождение в контексте moonly. Все эти константы, флаги, функции и так далее существуют только для проектов в пределах папки moonly.
moonly-command-tool: исправление ошибки с рекурсией require.
V0.1.4: Исправлена ошибка с getWorkingDirectory, из-за которой некоторые библиотеки (вроде mimgui) могли пытаться искать свои компоненты в папке src. Теперь getWorkingDirectory абсолютно всегда будет возвращать корневую папку проекта, а не папку с исходниками.
 
Последнее редактирование:

kyrtion

Известный
787
284
и как же банджлить в 1 файле? напоминает squish
то есть предлагаешь воспользоваться moonly а затем уже можно банджлить squish в этой папке проекта? или я не* понял
 
Последнее редактирование:

Musaigen

abobusnik
Автор темы
Проверенный
1,597
1,356
и как же банджлить в 1 файле? напоминает squish
то есть предлагаешь воспользоваться moonly а затем уже можно банджлить squish в этой папке проекта? или я понял
Нет. У тебя есть src/init.lua и есть папка с модулями src/my_project. Когда отгружаешь архив на бх, init.lua переименовываешь в my_project.lua, название папки так и оставляешь и всё это добро закидываешь в архив. Я могу написать конечно тулу для автоматизации этого, на том же питоне и скомпилить в ехе и это будет работать как command line tool, но пока ещё думаю над всем этим.
 
  • Нравится
Реакции: kyrtion

kyrtion

Известный
787
284
Попробовал и теперь мне больше понравилось moonly чем githelper
+реп и +уважуха

а что насчет получение библиотеки которые хранились в moonloader - их придется копировать в lib? или подобрать для адекватной работы, например только samp.lua и mimgui
 
Последнее редактирование:
  • Нравится
Реакции: Musaigen

Musaigen

abobusnik
Автор темы
Проверенный
1,597
1,356
Первая тестовая версия утилиты для упрощения разработки, написания на Python с использованием библиотеки argparse и zipfile и скомпиленная в exe`шник через auto-py-to-exe. Прописываете в PATH системы и кайфуете.

Всего две команды:
init - инициализирует дефолтный project.json
build - создаст из проекта архив (src + lib), который можно будет сразу выгружать на blasthack. (Сохраняет кодировку файла, так что не забывайте сохранять в Windows 1251)

1726226867755.png

1726226937823.png

Попробовал и теперь мне больше понравилось moonly чем githelper
+реп и +уважуха

а что насчет получение библиотеки которые хранились в moonloader - их придется копировать в lib? или подобрать для адекватной работы, например только samp.lua и mimgui
нет, require подхватит из муна все библиотеки, если они не оверрайднуты в локальных либах (иначе возьмет из локальных)
 
Последнее редактирование:
  • Нравится
Реакции: kyrtion

kyrtion

Известный
787
284
Lua:
-- src/init.lua
print('Script Shat version 0.0.1-release successfully loaded!')

Код:
[ML] (script) shat: Script Shat version 0.0.1-release successfully loaded!
[ML] (system) Loading script 'C:\Users\root\AppData\Local\Temp\moonly\moonly_shat.lua'...
[ML] (system) shat: Loaded successfully.
[ML] (script) shat: Script Shat version 0.0.1-release successfully loaded!
[ML] (system) shat: Script terminated. (4BD101AC)

Это так должно быть работать? Сначала убить скрипт и затем запускать. Может это не исправляется или так положено?

а еще не знаешь как создать каллбак, типа, если скрипт запуска помер, то модули их нужно завершить работу типа так.


src/init.lua, там все-все прописано, импорт модули и константы (кнш глобальные, а как же инчае),
в констант будет создано так: CONST.SCRIPT, у его включено имя скрипта, версия, тип версии и тд, а также LUA_SCRIPT.

я указал LUA_SCRIPT, тот скрипт который запускает, попробовал вставить в модулях указать:
Lua:
function onScriptTerminate(script, quit)
  if script == CONST.SCRIPT.LUA_SCRIPT then
    print('Oop\'s, this module crashed!')
  end
end
но это не пашет, есть идеи?
 
Последнее редактирование:

Musaigen

abobusnik
Автор темы
Проверенный
1,597
1,356
Это так должно быть работать? Сначала убить скрипт и затем запускать. Может это не исправляется или так положено?
он просто выгружается дольше чем загружается новый (ну или если быть точнее, moonloader выполняет main в отдельном потоке, из-за чего и происходит разница во времени, по идее так). script:reload не давал результатов потому используется вариант с script:unload и загрузкой скрипта.

if script == CONST.SCRIPT.LUA_SCRIPT then
Нужно использовать script.this или thisScript(), как и в обычных скриптах. Все скрипты загрузчики это такие же moonloader скрипты, единственное отличие - они подменяют package.path, package.cpath и добавляют константу MOONLY_ENVIRONMENT, константу и функцию получения версии, патчат getWorkingDirectory и добавляют getMoonloaderDirectory, ну и отличаются в пути к скрипту. За счёт этого и достигается совместимость и минимальное кол-во ошибок при переносе с moonly на moonloader.
 
Последнее редактирование:
  • Нравится
Реакции: kyrtion

kyrtion

Известный
787
284
Lua:
-- src/core/ui/init.lua
imgui = require('mimgui')

Код:
[ML] (system) Loading script 'C:\Users\root\AppData\Local\Temp\moonly\moonly_mytools.lua'...
[ML] (system) mytools: Loaded successfully.
[ML] (error) mytools: C:\Games\gtasa\moonloader\lib\mimgui\imgui.lua:8: cannot load module 'C:\Games\gtasa\moonly\mytools\src\lib\mimgui\cimguidx9': Не найден указанный модуль.

stack traceback:
    [C]: in function 'require'
    C:\Games\gtasa\moonly\mytools\src\core\ui\init.lua:4: in function 'start'
    C:\Games\gtasa\moonly\mytools\src\core\init.lua:11: in function 'start'
    [string "script_name('mytools')..."]:10: in function <[string "script_name('mytools')..."]:6>
[ML] (error) mytools: Script died due to an error. (0B31330C)

Нужно откатить на старой версии 0.1.2? Или из-за патча все мешает
 

Musaigen

abobusnik
Автор темы
Проверенный
1,597
1,356
Lua:
-- src/core/ui/init.lua
imgui = require('mimgui')

Код:
[ML] (system) Loading script 'C:\Users\root\AppData\Local\Temp\moonly\moonly_mytools.lua'...
[ML] (system) mytools: Loaded successfully.
[ML] (error) mytools: C:\Games\gtasa\moonloader\lib\mimgui\imgui.lua:8: cannot load module 'C:\Games\gtasa\moonly\mytools\src\lib\mimgui\cimguidx9': Не найден указанный модуль.

stack traceback:
    [C]: in function 'require'
    C:\Games\gtasa\moonly\mytools\src\core\ui\init.lua:4: in function 'start'
    C:\Games\gtasa\moonly\mytools\src\core\init.lua:11: in function 'start'
    [string "script_name('mytools')..."]:10: in function <[string "script_name('mytools')..."]:6>
[ML] (error) mytools: Script died due to an error. (0B31330C)

Нужно откатить на старой версии 0.1.2? Или из-за патча все мешает
Если судить по пути файла, ты засунул папку lib в папку src. Здесь есть пример структуры проекта.
Добавил репозиторий moonly на GitHub
UPD: Я понял в чём ошибка, сейчас всё залью.
UPD2: Залил всё на GitHub, теперь moonly можно получить только там (либо по прямой ссылке в топике).
 
Последнее редактирование:
  • Нравится
Реакции: kyrtion