Перейти к содержимому
AtomicScience

UMFAL - автоматический загрузчик модулей для сложных приложений

Рекомендуемые сообщения

Не знаю, как у вас, а у меня есть один пунктик - весь код должен быть аккуратненько разложен по маленьким файликам. Ну, или не очень аккуратненько... Но в любом случае, файлы размером более ста строк для меня уже становятся сложночитаемыми, и я предпочитаю их разбивать на два и более.

 

Но встает вопрос - эти два файла надо как-то, скажем так, совместить. Думаю, эта проблема возникала не только у меня, а учитывая повышенный интерес к многофайловым установщикам, я таки решился адаптировать свою достаточно старую разработку и вывести ее в свет.

Короче говоря, встречайте Unified Multi-File Application Loader, сокращенно UMFAL

 

И что же он позволяет делать?

UMFAL предоставляет возможность подгружать модули, находящиеся в произвольных подпапках вашего приложения, причем считает путь до них автоматически, вне зависимости от того, где именно ваше приложение установлено в системе пользователя.

Модули в UMFAL имеют ту же самую структуру, что и модули в обычном Lua (те самые, которые подгружаются с помощью require) :

local module = {}
-- Заполнение модуля полезными плюхами
return module

Конечно, как и в обычном Lua, никто не ограничивает вам тип возвращаемого значения - только ради всего святого, не возвращайте nil, иначе UMFAL будет ругаться!

 

Использование UMFAL на примере

Предположим, у нас есть небольшая программа, имеющая следующую структуру:

74163816_Pastedimage20210322010528.png.455745193d66ac88167d1e4c0704d707.png

В этом примере run.lua - файл, который и будет запускать наше приложение - лежит в корне папки myApp, а остальные файлы (модули) - в подпапках.

 

Инициализация приложения

Поскольку run.lua является точкой входа, то есть скриптом, с выполнения которого начинается исполнение всей программы, именно в нем нам нужно инициализировать объект нашего приложения:

local myApp = require("umfal").initAppFromRelative("myApplication")

В данном случае используется относительная инициализация - с помощью белой (и немножко черной) магии UMFAL узнает путь до выполняемого скрипта и создает объект приложения относительно папки, в которой этот скрипт лежит.

 

Загрузка модулей

После создания мы можем использовать этот объект в собственных корыстных интересах, загружая с его помощью наши модули:

local utilites = myApp.subfolder.utilities
local usefullStuff = myApp.subfolder.anotherFolder.usefullStuff

В результате в в переменных utilities и usefullStuff будет лежать результат исполнения метода dofile над файлами utilities.lua и usefullStuff.lua соответственно

 

Загрузка несуществующего модуля

Также важно отметить, что произойдет, когда мы попытаемся загрузить несуществующий модуль:

local notUsefullStuff = myApp.subfolder.anotherFolder.notUsefullStuff

В этом случае код просто бросит ошибку

 

Получение ранее инициализированного приложения

Хорошо, в скрипте точки входа мы можем загружать библиотеки, но что если нам нужно загрузить одну библиотеку из другой?
В данном случае, дабы не напрягать зря воображаемые ресурсы воображаемых компьютеров, можно получить ссылку на созданное ранее приложение:

local myApp = require("umfal")("myApplication")

Где "myApplication" это идентификатор, который ранее был задан в качестве аргумента функции инициализации - рекомендуется устанавливать в его качестве название вашего приложения.

 

Команда для загрузки (Pastebin)

pastebin get 2q6zhL05 -f /lib/umfal.lua

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
9 часов назад, AtomicScience сказал:

Но в любом случае, файлы размером более ста строк для меня уже становятся сложночитаемыми

Теперь зримо почему попадаются проекты с кучкой пустых файлов и непонятными названиями.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А загруженные модули не кешируются как библиотеки OpenOS? А если кешируются, то можно переключить эту фичу?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
35 минут назад, hohserg сказал:

А загруженные модули не кешируются как библиотеки OpenOS? А если кешируются, то можно переключить эту фичу?

Они кешируются в объекте приложения.

 

Соответственно, каждый раз, когда мы запускаем run.lua, создаётся новый объект с чистым кешем. Руками ничего выгружать не нужно

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...