Если вы привыкли тестировать свои модули в интерпретаторе Lua, как это обычно делаю я, вы часто оказывались в одном и том же рабочем процессе: вы запускаете интерпретатор, вы require
свой модуль, тестируете свой код, находите ошибку , исправьте это, … и тогда вам нужно выйти из интерпретатора, потому что вы не можете (удобно) перезагрузить отредактированный файл.
В этой статье я представляю относительно простой подход к перезагрузке модулей.
Как это работает
Когда модуль require
создается в Lua, выполняется поиск в package.loaded
, чтобы избежать многократной загрузки одного и того же модуля (см. документацию). В документации указано, что:
Когда вам требуется модуль
modname
иpackage.loaded[modname]
не является ложным,require
просто возвращает хранящееся там значение.
Это означает, что мы можем просто сбросить package.loaded[modname]
для любого модуля, который мы хотим перезагрузить, что приведет к загрузке модуля, когда он снова будет require
.
Для удобства мы напишем функцию, которая будет отслеживать любые модули по умолчанию (например, библиотеку string
), которых следует избегать. Когда наша функция перезагрузки (кстати, мы назовем ее R
) вызывается, она просто удаляет все нестандартные пакеты и требует их снова после этого. Чтобы еще больше упростить задачу, мы также можем искать все глобальные переменные (они находятся в переменной _G) для любых ранее загруженных пакетов и заменять их значения.
Код
И вот оно. Поместите этот файл рядом с вашими модулями, пока вы их тестируете, потребуйте его в REPL и используйте функцию R всякий раз, когда вам нужно перезагрузить свои модули. Поскольку все модули выгружаются перед повторной загрузкой любого модуля, все зависимые модули также будут обновлены. И вы даже можете продолжать использовать переменные, которые вы использовали раньше!
Наслаждаться!