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

lubu.png

LuBu - простенький склейщик .lua и .dll файлов написанный на коленке за 10 минут. Используя LuBu вы можете превратить такую кучу файлов в 1 .lua скрипт.​
Код:
vAcs/
├── dist/
├── src/
│   ├── ui/
│   │   ├── components/
│   │   │   ├── button.lua
│   │   │   ├── center-text.lua
│   │   │   ├── circle-glow.lua
│   │   │   ├── clickable-text.lua
│   │   │   ├── hint.lua
│   │   │   ├── image-url.lua
│   │   │   ├── input.lua
│   │   │   ├── item.lua
│   │   │   ├── item-drag.lua
│   │   │   ├── link.lua
│   │   │   ├── menu-notifications.lua
│   │   │   ├── navigation.lua
│   │   │   ├── page-header.lua
│   │   │   ├── phrases.lua
│   │   │   ├── scroller.lua
│   │   │   ├── skin.lua
│   │   │   ├── spinner.lua
│   │   │   ├── test-image-url.lua
│   │   │   ├── texture-loader.lua
│   │   │   ├── theme-switcher.lua
│   │   │   ├── toggle-button.lua
│   │   │   └── user-tags.lua
│   │   ├── pages/
│   │   │   ├── items.lua
│   │   │   ├── other.lua
│   │   │   ├── profiles.lua
│   │   │   ├── settings.lua
│   │   │   ├── skins.lua
│   │   │   └── sync.lua
│   │   ├── subpages/
│   │   │   ├── constructor.lua
│   │   │   └── library.lua
│   │   ├── windows/
│   │   │   ├── editor.lua
│   │   │   ├── main.lua
│   │   │   ├── save-edited-item.lua
│   │   │   ├── slots.lua
│   │   │   └── welcome.lua
│   │   ├── resource/
│   │   │   ├── fonts.lua
│   │   │   ├── logo.lua
│   │   │   └── logo-compact.lua
│   │   ├── ease.lua
│   │   ├── fonts.lua
│   │   ├── style.lua
│   │   └── smooth-menu.lua
│   ├── arizona.lua
│   ├── bones.lua
│   ├── colors.lua
│   ├── config.lua
│   ├── init.lua
│   ├── inventory.lua
│   ├── items.lua
│   ├── json.lua
│   ├── library.lua
│   ├── net.lua
│   ├── object-editor.lua
│   ├── raknet.lua
│   ├── skin.lua
│   ├── sub.lua
│   ├── sync.lua
│   └── utils.lua
├── lib/
├── project.json
├── 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",
    "out": "X:\\Arizona Games Launcher\\bin\\arizona\\moonloader\\bundled.lua",
    "watcher_delay": 150,
    "const": {
        "VERSION": "5.0.0-alpha"
    },
    "modules": {
        "arizona": "src\\arizona.lua",
        "bones": "src\\bones.lua",
        "colors": "src\\colors.lua",
        "config": "src\\config.lua",
        "init": "src\\init.lua",
        "inventory": "src\\inventory.lua",
        "items": "src\\items.lua",
        "json": "src\\json.lua",
        "library": "src\\library.lua",
        "net": "src\\net.lua",
        "object-editor": "src\\object-editor.lua",
        "raknet": "src\\raknet.lua",
        "skin": "src\\skin.lua",
        "sub": "src\\sub.lua",
        "sync": "src\\sync.lua",
        "ui.components.button": "src\\ui\\components\\button.lua",
        "ui.components.center-text": "src\\ui\\components\\center-text.lua",
        "ui.components.circle-glow": "src\\ui\\components\\circle-glow.lua",
        "ui.components.clickable-text": "src\\ui\\components\\clickable-text.lua",
        "ui.components.hint": "src\\ui\\components\\hint.lua",
        "ui.components.image-url": "src\\ui\\components\\image-url.lua",
        "ui.components.input": "src\\ui\\components\\input.lua",
        "ui.components.item": "src\\ui\\components\\item.lua",
        "ui.components.item-drag": "src\\ui\\components\\item-drag.lua",
        "ui.components.link": "src\\ui\\components\\link.lua",
        "ui.components.menu-notifications": "src\\ui\\components\\menu-notifications.lua",
        "ui.components.navigation": "src\\ui\\components\\navigation.lua",
        "ui.components.page-header": "src\\ui\\components\\page-header.lua",
        "ui.components.phrases": "src\\ui\\components\\phrases.lua",
        "ui.components.scroller": "src\\ui\\components\\scroller.lua",
        "ui.components.skin": "src\\ui\\components\\skin.lua",
        "ui.components.spinner": "src\\ui\\components\\spinner.lua",
        "ui.components.test-image-url": "src\\ui\\components\\test-image-url.lua",
        "ui.components.texture-loader": "src\\ui\\components\\texture-loader.lua",
        "ui.components.theme-switcher": "src\\ui\\components\\theme-switcher.lua",
        "ui.components.toggle-button": "src\\ui\\components\\toggle-button.lua",
        "ui.components.user-tags": "src\\ui\\components\\user-tags.lua",
        "ui.ease": "src\\ui\\ease.lua",
        "ui.fonts": "src\\ui\\fonts.lua",
        "ui.pages.items": "src\\ui\\pages\\items.lua",
        "ui.pages.other": "src\\ui\\pages\\other.lua",
        "ui.pages.profiles": "src\\ui\\pages\\profiles.lua",
        "ui.pages.settings": "src\\ui\\pages\\settings.lua",
        "ui.pages.skins": "src\\ui\\pages\\skins.lua",
        "ui.pages.sync": "src\\ui\\pages\\sync.lua",
        "ui.resource.fonts": "src\\ui\\resource\\fonts.lua",
        "ui.resource.logo": "src\\ui\\resource\\logo.lua",
        "ui.resource.logo-compact": "src\\ui\\resource\\logo-compact.lua",
        "ui.smooth-menu": "src\\ui\\smooth-menu.lua",
        "ui.style": "src\\ui\\style.lua",
        "ui.subpages.constructor": "src\\ui\\subpages\\constructor.lua",
        "ui.subpages.library": "src\\ui\\subpages\\library.lua",
        "ui.windows.editor": "src\\ui\\windows\\editor.lua",
        "ui.windows.main": "src\\ui\\windows\\main.lua",
        "ui.windows.save-edited-item": "src\\ui\\windows\\save-edited-item.lua",
        "ui.windows.slots": "src\\ui\\windows\\slots.lua",
        "ui.windows.welcome": "src\\ui\\windows\\welcome.lua",
        "utils": "src\\utils.lua"
    }
}

GitHub:
 

Вложения

  • lubu.exe
    2.4 MB · Просмотры: 24
Последнее редактирование:

chapo

tg/inst: @moujeek
Автор темы
Модератор
9,052
11,915
покажи итоговый результат
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

Известный
1,110
403
Альтернативный готовый сборщик 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 · Просмотры: 10
Последнее редактирование:

g305noobo

Известный
Модератор
318
531
для ленивых людей предлагаю добавить автогенерацию джсона
 

Vespan

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

DZONE

Известный
188
199
зачем здесь конфигурация через 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,732
4,032
зачем здесь конфигурация через 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

smeruxa.ru
Проверенный
1,407
755
Ждем итоговый результат, написанный не на коленке, и работающий максимально удобно 😇
 

Musaigen

shitposter
Проверенный
1,656
1,471
Ну раз такой хайп, добавил бандлер с твоего метода в 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

tg/inst: @moujeek
Автор темы
Модератор
9,052
11,915
Обновил, добаил возможность создавать константы и пофиксил путь к файлам
1734103010024.png

1734103006194.png
 

OSPx

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

chapo

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