Гайд LuBu // Простенький склейщик луашек

lubu.png

LuBu - простенький склейщик .lua файлов написанный на коленке за 10 минут. Используя LuBu вы можете превратить такую кучу файлов в 1 .lua скрипт.​
Код:
vAcs/
├── dist/
├── src/
│   ├── cfg-tools/
│   │   ├── base64.lua
│   │   ├── json.lua
│   │   └── reflect.lua
│   ├── components/
│   │   ├── hint-button.lua
│   │   ├── image-url.lua
│   │   ├── input.lua
│   │   ├── link.lua
│   │   ├── main-menu.lua
│   │   ├── scroller.lua
│   │   ├── slots-menu.lua
│   │   ├── spinner.lua
│   │   ├── start-menu.lua
│   │   └── toggle-button.lua
│   ├── resource/
│   │   ├── fonts/
│   │   │   ├── bold.lua
│   │   │   └── regular.lua
│   │   └── images/
│   │       ├── logo.lua
│   │       └── logo-compact.lua
│   ├── cfg.lua
│   ├── skin.lua
│   ├── sync.lua
│   ├── utils.lua
│   ├── config
│   ├── init.lua
│   ├── items.lua
│   ├── net.lua
│   ├── object-editor.lua
│   ├── render-object.lua
│   └── init.lua
├── lubu.json
└── lubu.exe

Использование:
  1. скачиваем lubu.exe файл из вложений
  2. создаем файл lubu.json в папке с нашим проектом
  3. в lubu.json файле указываем главный файл, все модули и путь по которому будет создан склеенный файл
  4. запускаем lubu командой lubu.exe lubu.json или просто переносим .json на lubu.exe
  5. готово!
    1734014851935.png
Пример lubu.json:
JSON:
{
    "main":"src/init.lua",
    "modules":{
        "cfg-tools.base64": "src/cfg-tools/base64.lua",
        "cfg-tools.json": "src/cfg-tools/json.lua",
        "cfg-tools.reflect": "src/cfg-tools/reflect.lua",
        "cfg": "src/cfg.lua",
        "components.hint-button": "src/components/hint-button.lua",
        "components.image-url": "src/components/image-url.lua",
        "components.input": "src/components/input.lua",
        "components.link": "src/components/link.lua",
        "components.main-menu": "src/components/main-menu.lua",
        "components.scroller": "src/components/scroller.lua",
        "components.slots-menu": "src/components/slots-menu.lua",
        "components.spinner": "src/components/spinner.lua",
        "components.start-menu": "src/components/start-menu.lua",
        "components.toggle-button": "src/components/toggle-button.lua",
        "config": "src/config.lua",
        "init": "src/init.lua",
        "items": "src/items.lua",
        "net": "src/net.lua",
        "object-editor": "src/object-editor.lua",
        "render-object": "src/render-object.lua",
        "resource.fonts.bold": "src/resource/fonts/bold.lua",
        "resource.fonts.logo-compact": "src/resource/fonts/logo-compact.lua",
        "resource.fonts.regular": "src/resource/fonts/regular.lua",
        "resource.images.logo-compact": "src/resource/images/logo-compact.lua",
        "resource.images.logo": "src/resource/images/logo.lua",
        "skin": "src/skin.lua",
        "sync": "src/sync.lua",
        "utils": "src/utils.lua"
    },
    "output":"dist/vAcs-bundled.lua"
}

GitHub:
 

Вложения

  • lubu.exe
    2.4 MB · Просмотры: 1

chapo

чопа сребдс // @moujeek
Автор темы
Модератор
8,931
11,695
покажи итоговый результат
src/init.lua
Lua:
local add = require('add');
local mul = require('mul');

print(add(10, 5));
print(mul(2, 2));
src/add.lua
Lua:
return function(a, b)
    return a + b;
end
src/mul.lua
Lua:
return function(a, b)
    return a * b;
end

Output:
Lua:
--[[Bundled using LuBu - Simple Lua Bundler]]

--Module add (src/add.lua)
package.preload['add'] = (function(...)
return function(a, b)
    return a + b;
end
end)

--Module mul (src/mul.lua)
package.preload['mul'] = (function(...)
return function(a, b)
    return a * b;
end
end)

--Entry Point main (src/init.lua)
local entry = (function(...)
local add = require('add');
local mul = require('mul');

print(add(10, 5));
print(mul(2, 2));
end)
entry();
 

kyrtion

Известный
970
353
Альтернативный готовый сборщик squish с системой Git + moonly
Если пишешь Lua с модулям, очень советую поработать с системой Git проекта moonly и сборщиком squish, что упростит затраты и время на разработку проекта. Сборщик собирает файлов, приклеивает и получится один готовый скрипт. Есть одно но, некоторые папки которые не нужно собирать файлы и склеивать (ignoredDirs). Ведь если хотите чтобы ненужные тесты, или папка для кэш, временные данные, логи не хранились в готовом скрипте. Что сильно напоминает на .gitignore.

Инструкция установки и настройки шаблон moonly с готового сборщика squish
1. Скачать скрипт moonly.lua и бинарный файл LuaFileSystem (lfs.dll)
2. moonly.lua закинуть в папке moonloader, lfs.dll в moonloader/lib
3. Отключить AutoReboot.lua в moonloader, во избежание конфликта после полной перезагрузки скриптов, иначе moonly запустит 2 раза скрипт
4. Создать папку moonly в корневой папке игры GTA:SA
5. Скачать прикрепленный архив (внизу) и распаковать в moonly.
И тогда должно быть так: gtasa/moonly/template-moobly-squish
Переименовать папка можно, но только адекватно задайте имя папки, например, fake-sync, s0beit-tools и пр.
Есть еще один способ на Git. Открыть командную строку в папке gtasa/moonly и клонировать репозитории GitHub:
Код:
git clone https://github.com/kyrtion/template-moonly-squish.git
6. Настраивать файл конфигурации проекта и сборщика в project.json для корректной работы
7. Удачи с кодированием проекта!

Инструкция как забильдить с помощью сборщика squish
1. Настроить конфиг сборщика в project.json
2. Открыть командная строка (в VSCode: Ctrl + Ё/~/`)
3. Путь должно быть чтобы там стояло с файлом squish.bat для запуска, например:
C:\...\gtasa\moonly\тут могла быть ваша папка проекта
4. Пропишем squish и отправляем Enter, после сборка и бильда появится готовый скрипт release.lua в папке build
1734016233632.png

1734016250622.png


Структура настройка сборщика squish в project.json
1734081510694.png

pathFiles
- путь папки которое сборщик будет собирать файлов и соединить
mainFile - файл, которое сделает как основное и главное (войдет в src и берет файл init.lua)
outputFolder - папка для релиза готового скрипта (заранее создает)
outputFile - файл релиза, который полностью склеен и готово к запуску в moonloader
ignoreDirs - массивные строка путь папки, сборщик будет проигнорится перечисленные путь папки

Когда эта тема вышла, и я хотел бы поделиться аналогичный готовый сборщик squish, если очень сильно любишь luajit.
На этом все, если будут вопросы или баги, пишите, исправим.
 

Вложения

  • template-moonly-squish.zip
    511.1 KB · Просмотры: 6
Последнее редактирование:

Vespan

Чешский луашер
Проверенный
2,124
1,734
Достаточно заебато, этим мне clue и нравился и выйшла альтернатива
  1. создаем файл lubu.json в папке с нашим проектом
  2. в lubu.json файле указываем главный файл, все модули и путь по которому будет создан склеенный файл
  3. запускаем lubu командой lubu.exe lubu.json или просто переносим .json на lubu.exe
Не хватает какого то интерфейса шобы избавится от этой мозгоебки и будет крутямбова
 

DZONE

Известный
188
200
зачем здесь конфигурация через json? почему не делать все через терминал

Bash:
#!/bin/bash

if [ $# -lt 2 ]; then
  echo "usage: $0 [ENTRYPOINT] [OUTPUT] [FILES...]"
  exit 1
fi

ENTRY_POINT=$1
OUTPUT_FILE=$2
FILES=("${@:3}")

preload_lua_file() {
    local file=$1
    local base_dir=$(dirname "$ENTRY_POINT")
    local module_name=$(echo "$file" | sed "s|$base_dir/||" | sed "s|.lua$||" | tr '/' '.')

    echo "package.preload['$module_name'] = function()" >> "$OUTPUT_FILE"
    cat "$file" >> "$OUTPUT_FILE"
    echo "end" >> "$OUTPUT_FILE"
    echo "" >> "$OUTPUT_FILE"
}

> "$OUTPUT_FILE"

export -f preload_lua_file
export ENTRY_POINT
export OUTPUT_FILE

for item in "${FILES[@]}"; do
    if [ -d "$item" ]; then
        find "$item" -type f -name "*.lua" ! -samefile "$ENTRY_POINT" -exec bash -c 'preload_lua_file "$0"' {} \;
    elif [ -f "$item" ] && [ "$item" != "$ENTRY_POINT" ]; then
        preload_lua_file "$item"
    fi
done

cat "$ENTRY_POINT" >> "$OUTPUT_FILE"

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

Bash:
[dzone@archlinux test]$ tree .
.
├── merger.sh
└── src
    ├── a
    │   └── p
    │       └── something2.lua
    ├── main.lua
    └── something1.lua

4 directories, 4 files
[dzone@archlinux test]$ ./merger.sh src/main.lua output.lua src/
[dzone@archlinux test]$ cat output.lua
package.preload['something1'] = function()
return function()
    return "bye"
end
end

package.preload['a.p.something2'] = function()
return "hi"
end

local something2 = require("a.p.something2")
local something1 = require("something1")

print(something2, something1())
[dzone@archlinux test]$
 
Последнее редактирование:
  • Нравится
  • Влюблен
Реакции: The Spark и Vespan

chromiusj

Известный
Модератор
5,650
3,950
зачем здесь конфигурация через json? почему не делать все через терминал

Bash:
#!/bin/bash

if [ $# -lt 2 ]; then
  echo "usage: $0 [ENTRYPOINT] [OUTPUT] [FILES...]"
  exit 1
fi

ENTRY_POINT=$1
OUTPUT_FILE=$2
FILES=("${@:3}")

preload_lua_file() {
    local file=$1
    local base_dir=$(dirname "$ENTRY_POINT")
    local module_name=$(echo "$file" | sed "s|$base_dir/||" | sed "s|.lua$||" | tr '/' '.')

    echo "package.preload['$module_name'] = function()" >> "$OUTPUT_FILE"
    cat "$file" >> "$OUTPUT_FILE"
    echo "end" >> "$OUTPUT_FILE"
    echo "" >> "$OUTPUT_FILE"
}

> "$OUTPUT_FILE"

export -f preload_lua_file
export ENTRY_POINT
export OUTPUT_FILE

for item in "${FILES[@]}"; do
    if [ -d "$item" ]; then
        find "$item" -type f -name "*.lua" ! -samefile "$ENTRY_POINT" -exec bash -c 'preload_lua_file "$0"' {} \;
    elif [ -f "$item" ] && [ "$item" != "$ENTRY_POINT" ]; then
        preload_lua_file "$item"
    fi
done

cat "$ENTRY_POINT" >> "$OUTPUT_FILE"

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

Bash:
[dzone@archlinux test]$ tree .
.
├── merger.sh
└── src
    ├── a
    │   └── p
    │       └── something2.lua
    ├── main.lua
    └── something1.lua

4 directories, 4 files
[dzone@archlinux test]$ ./merger.sh src/main.lua output.lua src/
[dzone@archlinux test]$ cat output.lua
package.preload['something1'] = function()
return function()
    return "bye"
end
end

package.preload['a.p.something2'] = function()
return "hi"
end

local something2 = require("a.p.something2")
local something1 = require("something1")

print(something2, something1())
[dzone@archlinux test]$
а где вена?
 
  • Грустно
Реакции: Vespan

Smeruxa

Известный
1,369
726
Ждем итоговый результат, написанный не на коленке, и работающий максимально удобно 😇
 

Musaigen

abobusnik
Проверенный
1,614
1,372
Ну раз такой хайп, добавил бандлер с твоего метода в moonly-cli https://github.com/themusaigen/moonly-command-tool.
Также можно указывать выходную директорию и дополнительные директории для команды moonly build
Через терминал в корневой папке проекта прописываешь (если EXE-шник прописан в PATH системы) moonly bundle и получаешь свой файл.
Структуру проекта можно увидеть на гитхабе. Указывать порядок файлов не надо. Лишь доп. директории/игнорируемые директории.

Пример, как будет выглядеть это дело:
Lua:
-- Bundled using <moonly>
-- Get moonly at <https://github.com/themusaigen/moonly>

-- Module <mod.lua> (src\mod.lua)
package.preload["mod"] = function(...)
return function(a, b)
  return a % b
end
end

-- Module <sum.lua> (src\sum.lua)
package.preload["sum"] = function(...)
return function (a, b)
  return a + b
end
end

-- Module <init.lua> (src\test-project\init.lua)
package.preload["test-project"] = function(...)
return {
  value = 1234
}

end

-- Module <module.lua> (src\test-project\module.lua)
package.preload["test-project.module"] = function(...)
return {
  something_secret = 1337
}
end

-- Module <init.lua> (src\test-project\submodule\init.lua)
package.preload["test-project.submodule"] = function(...)

end

-- Module <submodule.lua> (src\test-project\submodule\submodule.lua)
package.preload["test-project.submodule.submodule"] = function(...)

end

-- Module <init.lua> (lib\test-lib\init.lua)
package.preload["test-lib"] = function(...)
return {
  someMethod = function()
    print("Hello world")
  end
}

end

-- Core file <init.lua>
local lib = require("test-lib")
local project = require("test-project")
local sum = require("sum")
local mod = require("mod")

lib.someMethod()

assert(project.value == 1234)

assert(sum(2, 2) == 4)
assert(mod(4, 2) == 0)
 
  • Нравится
Реакции: whyega52, kyrtion и chapo

chapo

чопа сребдс // @moujeek
Автор темы
Модератор
8,931
11,695
Обновил, добаил возможность создавать константы и пофиксил путь к файлам
1734103010024.png

1734103006194.png
 

OSPx

Участник
39
17
Думаю норм фича будет, добавить возможность бандлить всякие файлы других форматов, например json, yml в lua модуль который возращает таблицу, ttf в base64 (или какой там), и т.д
 

chapo

чопа сребдс // @moujeek
Автор темы
Модератор
8,931
11,695
Думаю норм фича будет, добавить возможность бандлить всякие файлы других форматов, например json, yml в lua модуль который возращает таблицу, ttf в base64 (или какой там), и т.д
ну жсон и yml можно, но вот шрифты вряд ли выйдет, типо как ты их юзаешь во время разработки если они не переведены в base64?