Если вы привыкли тестировать свои модули в интерпретаторе Lua, как это обычно делаю я, вы часто оказывались в одном и том же рабочем процессе: вы запускаете интерпретатор, вы require свой модуль, тестируете свой код, находите ошибку , исправьте это, … и тогда вам нужно выйти из интерпретатора, потому что вы не можете (удобно) перезагрузить отредактированный файл.

В этой статье я представляю относительно простой подход к перезагрузке модулей.

Как это работает

Когда модуль require создается в Lua, выполняется поиск в package.loaded, чтобы избежать многократной загрузки одного и того же модуля (см. документацию). В документации указано, что:

Когда вам требуется модуль modname и package.loaded[modname] не является ложным, require просто возвращает хранящееся там значение.

Это означает, что мы можем просто сбросить package.loaded[modname] для любого модуля, который мы хотим перезагрузить, что приведет к загрузке модуля, когда он снова будет require.

Для удобства мы напишем функцию, которая будет отслеживать любые модули по умолчанию (например, библиотеку string), которых следует избегать. Когда наша функция перезагрузки (кстати, мы назовем ее R) вызывается, она просто удаляет все нестандартные пакеты и требует их снова после этого. Чтобы еще больше упростить задачу, мы также можем искать все глобальные переменные (они находятся в переменной _G) для любых ранее загруженных пакетов и заменять их значения.

Код

И вот оно. Поместите этот файл рядом с вашими модулями, пока вы их тестируете, потребуйте его в REPL и используйте функцию R всякий раз, когда вам нужно перезагрузить свои модули. Поскольку все модули выгружаются перед повторной загрузкой любого модуля, все зависимые модули также будут обновлены. И вы даже можете продолжать использовать переменные, которые вы использовали раньше!

Наслаждаться!