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

Garry's Mod - Минификация кода сервера

· 5 мин. чтения

code minification banner

предупреждение

Подойдет тем, у кого сервер работает на VDS/Dedicated server с Linux на борту (хостинг без доступа к консоли не подойдет)

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

У нас на VDS будет 2 игровых сервера: запароленный DEV сервер и публичный PROD. На проде играют игроки, на DEV мы пишем код. На DEV код у нас в исходном виде (без кракозябров и буллшита), на проде код минифицирован, еще и упакован в одну единственную папку, если вы решили сделать, как я писал ранее. Когда мы захотим выпустить обнову на прод – выполним простой deploy.sh скрипт и все произойдет автоматически за 2 секунды.

🤔 Что такое минификация

what the fuck mouse meme

Минификация это сжатие кода. Ниже пример с одной функцией. Когда функций очень много, то разница заметна намного и НАМНОГО сильнее.

-- Какой-то комментарий к коду, который удалится

local function SomeFunctionName(someVar1, someVar2)
return someVar1 * someVar2
end

local CONSTANT_VAR = SomeFunctionName(123, 321)
print(CONSTANT_VAR)
local function a(b,c)return b*c end local d=a(123,321)print(d)

Чаще всего минификацию применяют в браузере (js). Это делают, чтобы скрипт занимал меньше места и страница быстрее грузилась. Вот оригинальный скрипт jQuery, вот минифицированный. Не хило так заметно разницу, эге?

😎 Чем полезна в гмоде

В нашем случае мы будем делать это для того, чтобы воришкам кода пришлось попотеть, чтобы найти в нашем коде что-то интересное, а потом еще попотеть, чтобы превратить непонятную кашу букв и цифр во что-то читабельное (если все-таки что-то найдут 😸). Просто представьте их лицо, когда они увидят кашу букв и цифр

испуганное лицо

к сведению

Для тех, кто не в курсе. В гмоде существует понятие ScriptHook. При помощи скриптхука ЛЮБОЙ человек может украсть ваш код, который выполняется на клиенте (интерфейсы, визуальные эффекты, анимации), даже если у вас стоит античит.

Еще в гмоде часто происходят утечки полных сборок, включая и серверную часть. Т.е. вообще все файлы. Украденная сборка с файлами-уродами будет непригодна для использования, если их не нормализировать, на что потребуется очень много времени (возможно, месяцы или даже годы)

В теории минификация также может и ускорить запуск Garry's Mod сервера.

👌 Проблемы и решения

фиксики

У меня хостинг

Решение писать не планирую

Если у вас хостинг лишь с доступом к файлам по FTP, то автоматизировать деплой минифицированных файлов возможно, но сложно. Проще базово разобраться с Linux 🐧

Отладка кода

Решено наполовину

Минифицированный файл это код, превращенный в 1 строку. Если в минифицированном коде случится ошибка, то найти ее будет сложнее.

+- Решение – установите GLuaFixer (glualint) (можно в VSCode или SublimeText) и используйте в нем функцию Pretty Print. Она, как минимум, отформатирует код так, чтобы он был не однострочным и искать проблему станет проще.

Поиск минификатора

Решено

  1. Скрипты в гмоде пишутся на gLua. Он похож на Lua, но со своими синтаксическими "приколами", из-за которых обычные Lua минификаторы нам не подойдут (не умеют понимать !, !=, continue и тд).
  2. Некоторые минификаторы не умеют понимать, что переменная является ГЛОБАЛЬНОЙ и ее нельзя переименовывать (например somelib в b)

Спустя несколько лет поиска, на свет таки появился "правильный" минификатор, который неплохо работает с glua: https://github.com/xUnkNx/glua-minify. Его мы и будем использовать.

🚀 Использование

hacker

# Идем в удобную папку для теста
cd /home/user

# Скачиваем minify.lua
curl -O https://raw.githubusercontent.com/xUnkNx/glua-minify/main/minify.lua

# Скачиваем какой-то Lua файл для теста минификатора
curl -O https://raw.githubusercontent.com/GM-DONATE/IGS/0850d6dc5e3fb5a007c6fb0e655706898dde116b/addons/igs-core/lua/igs/apinator.lua

# Минифицируем выбранный файл
# Команда создаст его минифицированную копию рядом
lua minify.lua minify apinator.lua > apinator.min.lua

# Можем посмотреть результат:
less apinator.min.lua
# для выхода с less нажмите q
к сведению

Если возникла ошибка, что Lua не найден, то установите его. Желательно, версию 5.2-5.3: apt install lua5.3

С одним файлом наигрались, давай автоматизировать минификацию всего прода!

Допустим, наш прод находится по пути /home/user/prod

# идем в папку с серверами И minify.lua (он должен быть тут же)
cd /home/user

# выводим все lua файлы, которые есть в addons
# gamemodes пока не трогаем
find prod/garrysmod/addons -name '*.lua'

# вывело? Все правильно? Отлично!
# Тогда давай их всех превратим в минифицированные файлики
find prod/garrysmod/addons -name '*.lua' -exec bash -c 'lua minify.lua minify "$1" > tmp.lua || cp -v "$1" tmp.lua ; cp -v tmp.lua "$1"' sh {} \;

# Обращаем внимание:
# \; в конце обязателен
# prod/garrysmod/addons из примера заменить на путь к вашей addons папке от текущей папки
# tmp.lua это временный файл, куда помещается минифицировнный код, прежде чем заменить оригинальный файл. Это связано с тем, что системный IO почему-то не может считать и сразу перезаписать файл, который читает
# Вы можете поместить minify.lua куда удобно, просто не забудьте поменять путь к этому файлу в команде

💡 Что дальше?

  • Можно улучшить скрипт, чтобы он минифицировал только клиентские файлы
  • Дописать deploy.sh из поста про ускорение запуска гмод сервера, чтобы он и файлы минифицировал
  • Можно минифицировать также gamemodes/name
  • А еще поискать прочие Штуки
  • Посмотреть на индуса