IMP - Indaxia Modules & Packages for Lua

Добавлен , опубликован
Простое управление пакетами и модулями для приложений, написанных на Lua и других языках с динамической типизацией.
Добавляет в ваш проект управление пакетами и es6-like модули Lua без copy-paste боли и dependency ада.

Возможности

IMP состоит из менеджера пакетов и менеджера модулей с собственной частью кода Lua.
Новый способ работы с зависимостями lua: IMP Module Manager📡
Lazy-loading модули с инспекцией кода через LuaLS или EmmyLua!
Ни один параметр не спрячется от ваших.точечек :)

Пример написания модульного кода

-- файл 1
Hello = Imp.export("Hello", function()
  -- пишите любой инит код здесь, он исполнится один раз
  -- экспортируем модуль (ваши данные и функции или пустой table)
  return {
    foo = "bar",
    welcome = function() print "Hello world!" end
  }
end)

-- файл 2
World = Imp.export("World", function()
  -- импортируем модули
  local Hello = Imp.import(Hello)
  -- пишите любой инит код здесь, он исполнится один раз
  Hello.welcome()

  -- экспортируем модуль (ваши данные и функции или пустой table)
  return {}
end)

-- инит секция (main)
local World = Imp.import(World)
Результат:
Hello world!
Подробнее про модули и как разрешаются конфликты одинаковых имен модулей: github.com/Indaxia/imp-lua-mm
Возможности Менеджера Пакетов:
  • Работает с оффлайн каталогами и онлайн репозиториями
  • Собственный формат конфигурации пакета в JSON
  • Установка пакетов с зависимостями из Github и Bitbucket
  • Установка отдельных файлов напрямую из Github, Bitbucket или других хостов (разрешение их в конфигурации)
  • Вотчер за файлами и каталогами (исходники, конфиг, целевой файл) - билдим на лету!
  • Разрешает версионность зависимостей
  • Настройте форматы для других языков и отвяжитесь от lua
Возможности Менеджера Модулей Lua:
  • Включайте свои доп. директории как дополнительные исходники
  • Верный порядок зависимостей в целевом файле
  • ES6-like импорты и экспорты в Lua скрипте
  • Реально быстрый билдер целевого файла на ходу (C# watcher)

Быстрый старт

  1. Установите IMP
  2. Для моддинга игр (особенно Warcraft 3 Reforged следуйте специальным шагам)
  3. (для Linux) создайте симлинк /usr/bin/imp -> (папка imp)/imp
  4. Откройте любой терминал (нажать Win+R и ввести "cmd")
  5. Введите cd <папка вашего проекта>
  6. Введите imp init src build.lua где src может быть любой папкой исходников в вашем проекте
  7. imp watch и теперь можно писать код и билдить на ходу!
Для инициализации пакета введите imp init build.lua. Эта команда создаст imp-package.json и .imp папку с зависимостями. Если используете git (mercurial/svn/...), добавьте .imp в игнор файл (.gitignore).
Для добавления нового пакета в зависимости ввести imp install <пакет> <версия - опционально>

Быстрый старт для моддинга Warcraft 3 / других игр

  1. создать папку проекта с подпапкой "src" или любой другой (заменить src на нее)
  2. сохранить вашу карту в режиме "карта как директория" внутрь папки проекта
  3. Откройте любой терминал (нажать Win+R и ввести "cmd")
  4. Введите cd <папка вашего проекта>
  5. Введите imp init src папка-карты.w3x/war3map.lua
  6. Установите все зависимости, которые вам нужны
  7. imp watch
Теперь создавайте свои файлы в "src" или сохраняйте вашу карту для сборки и тестирования её на ходу.
Использование imp watch позволяет уведомлять PM и MM, если что-то изменилось и производить скачивание новых пакетов и/или пересобирать модули. Вотчер ожидает изменения одного из следующих:
  • любая директория из пункта конфига "sources"
  • файл из пункта конфига "target"
  • самого файла конфига

Расширенные возможности

Включение файлов

Вы можете включать файлы напрямую (в примере Big Integer):
imp install https://raw.githubusercontent.com/DeBos99/lua-bigint/master/bigint.lua * file

Чистый init

Если вы не хотите использовать MM на стороне клиента (Lua), вы можете отключить его, удалив из зависимостей, или инициализировать проект с помощью init-clean:
imp init-clean target.lua
При использовании этой опции IMP просто включает код зависимостей без MM.

Выполнение команды до/после сборки

До и после завершения процесса сборки можно выполнить команду терминала:
  "beforeBuild": "cmd /C echo \"BEFORE BUILD!\"",
  "afterBuild": "cmd /C echo \"AFTER BUILD!\" ",
Также можно добавить подстановку, чтобы заменить её именем целевого файла:
  "beforeBuild": "cmd /C echo \"BEFORE BUILD! The target file is: %target%\"",
  "afterBuild": "cmd /C echo \"AFTER BUILD! The target file is: %target%\" ",
Результат будет чем-то типа:
"BEFORE BUILD! The target file is: C:\Local\My project\build.lua"
...
"AFTER BUILD! The target file is: C:\Local\My project\build.lua"
Это работает только для корневых проектов.

Добавление дополнительных вотчеров

Чтобы триггернуть пересборку по изменению каких-нибудь других файлов вне src/target, добавьте их в раздел "watchExtra":
  "watchExtra": [
    "my extra file 1.w3n",
    "my extra file 2.w3x",
  ]

Публикация пакетов

Если вы хотите опубликовать свой пакет, выполните следующие действия:
  • Создайте репозиторий git на Github или Bitbucket.
  • Создайте imp-package.json в корне репозитория.
  • Добавьте параметры "dependencies" и "sources". См. полный пример конфигурации ниже.
  • (необязательно) добавьте git tag в репозитории (версию типа 0.1)
Теперь это пакет IMP!
Для лучшего понимания изучайте структуру imp-demo.
Пример полного конфига
{
{
    "title": "IMP - Demo Package", // (optional) your package or root project title
    "author": "ScorpioT1000 / scorpiot1000@yandex.ru", // (optional) author information
    "license": "MIT", // (optional) source code license
    "dependencies": { // list of packages and files required by your source code
        // github repository from a master branch
        "https://github.com/123/456": "*",
        
        // github repository from the release tagged as "1.1.1"
        "https://github.com/123/456": "1.1.1",
        
        // bitbucket repository from the release tagged as "1.0.0" in an object format
        "https://bitbucket.org/123/789": { "type": "package", "version": "1.0.0" },
        
        // inserts a file directly from the repository
        "https://github.com/123/456/blob/master/somefile.lua": { 
            "type": "file", 
            "topOrder": true  // omit this option or set to false to insert the file after repositories' sources
        }
    },
    // (optional for root project) where your sources are stored. It's important for the package, but can be omitted for root project (it watches "target")
    "sources": [
        "src"
    ],
    // (optional) where to store compiled build. It works for root project only. You can specify different extension for another language
    "target": "build.lua",
    // (optional) extra file list to trigger rebuild on their change (one relative file name per element)
    "watchExtra": [],
    // (optional) execute this command before build, e.g. "cmd /C echo \"Hello!\"". Placeholders available: %target%
    "beforeBuild": "",
    // (optional) execute this command after build, e.g. "cmd /C echo \"Hello!\"". Placeholders available: %target%
    "afterBuild": "",
    // (optional) allow more hosts for direct file dependency (allows github.com and bitbucket.org by default). It works for root project only.
    "allowHosts": []
    // (optional) set custom file extensions to use another language (e.g. "*.js")
    "sourceExtensions": "*.lua",
    // (optional) set custom comment format to use another language (e.g. "//")
    "sourceCommentFormat": "--"
}
}

Ограничения

  • Не поддерживает частичную подстановку версий типа 1.*, т.к. не использует реестр пакетов.
  • Выполняет полную повторную загрузку при любом изменении зависимостей в конфиге.

Как собрать из исходников

Склонировать github.com/Indaxia/imp
Выполнить:
dotnet publish -c Release --self-contained --runtime win-x64 /property:Version=ВАША_ВЕРСИЯ
dotnet publish -c Release --self-contained --runtime linux-x64 /property:Version=ВАША_ВЕРСИЯ
Затем использовать Inno Setup для Windows и открыть с его помощью Setup\win-x64.iss, для создания установочного файла.
P.S. Какой такой WLPM? Не было такого...
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
38
0
Библиотеки, которые уже сейчас используют IMP:
0
29
0
Tree Shaking завезли? И что по поводу вставки в карту?
Ответы (5)
0
38
0
nazarpunk, это не супер нужная фича. Я не писал анализаторов, я сделал трик для того, чтобы луа анализаторы пробрасывали тип правильно
Что нужнее так это дофиксить работу с локфайлом и пофиксить баг вставки вообще всех сурсов указанного расширения из пакетов
0
38
0
nazarpunk, по поводу вставки в карту, как будто это уже не забота imp, больше хочется распространить на другие языки и моддинг решения. Посмотреть, как дела в других играх с моддингом. Может, galaxy script тот же поддерживать
0
29
0
ScorpioT1000, ну я вот вообще хз насчёт универсального комбайна. Для начала бы весь процесс сборки для рефа сделать, чтоб не обмазываться кучей сборщиков. Ну и вообще добавить compile time синтаксис, чтоб объедки в РО создавать из кода.
0
38
0
nazarpunk, вообще есть postBuild строка, туда можно засунуть пост-компилятор, который будет что-то подменять и доставать и класть в карту. Возможно, сделать больше эвентов. Чтобы можно было до билда доставать из карты. Разделить целевой файл и файл, который слушаем на два разных
Нам просто нужны мини утилиты для этих целей и сделать отдельно обвешанный сборщик
0
29
0
ScorpioT1000, я в своём плагине наоборот делаю мега фабрику. Очень удобно например, когда AngelScript понимает JASS функции без промежуточной конвертации.
0
38
0
Вышла новая версия! Прокрутить к ресурсу
Версия 1.1
  • исправлена вставка вообще всех исходников из зависимых пакетов (теперь только из их sources)
  • добавлен опциональный параметр "beforeBuild", подробнее
  • в значения "beforeBuild" и "afterBuild" теперь можно вставлять %target% для подстановки имени целевого файла сборки
  • добавлен опциональный параметр "watchExtra" - перечислите файлы, за которыми надо следить, но не задействовать в сборке
Чтобы оставить комментарий, пожалуйста, войдите на сайт.