Lua.Busted в Windows

В качестве системных скриптов Powershell очень неплох, но мне было интересно разобраться с Lua. Для этого я зарегистрировался на http://exercism.io на соответствующий трек.

Сайт предоставляет утилиту командной строки, которая позволяет как скачивать задания в рабочую папку, так и загружать результат на сайт. При этом из коробки используется фреймворк Busted: запускаешь в консоли busted и твой код проверяется заранее подготовленными тестами.

В Elementary OS всё это заработало за несколько команд в консоли, однако я всё равно предпочитаю Windows, но там всё оказалось несколько сложнее.

Busted ставится через менеджер пакетов Luarocks, а Luarocks ставится через хороший менеджер пакетов — Chocolatey.

В менеджере пакетов Chocolatey сразу можно написать choco install luarocks, оно установится и будет работать. А вот luarocks install busted будет загружать зависимости и сразу упадёт, поскольку не найдёт cl.exe для выполнения команды… компиляции. Да, Busted хочет собираться из исходников.

К счастью, у меня как адепта C# & F#, был установлен Visual Studio 2019. Однако, cl.exe среди установленных мною пакетов для этих языков отсутствовал. Было выяснено, что это утилита из пакета MS Build Tools. Однако далее возникает ошибка, так же команда не находит errno.h, заголовочный файл.

Дабы опустить многочасовую историю выгрузки MinGW и попытки прописать директории /include, сразу скажу: необходимо поставить в Visual Studio пакет Windows 10 SDK, а чтобы Busted собрался: запустить от имени администратора файл C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\Tools\launchdevcmd.bat — командную строку разработчика в Visual Studio, в нём подхватываются нужные пути к исходникам.

И немаловажное: в path не нужно брать в кавычки длинные пути с пробелами, там уже есть разделитель ;. Если кавычки будут, то (в частности) эта самая строка разработчика тоже будет падать…

Достаточно длинный путь, чтобы просто написать в Lua «Hello, world».

Чтобы исполнять файлы .lua в командной строке без вызова интерпретатора, нужно сделать несколько вещей.

  • дописать .lua к переменной PATHEXT: set PATHEXT=.py;.py3;.msc;.exe;.com;.cmd;.bat;.lua (или set PATHEXT=.lua;%PATHEXT%), что позволит вызывать файл без дописывания расширения;
  • создать расширение: assoc .lua=LuaScript;
  • при помощи утилиты создания типа файла создать тип файла, например, Luascript: ftype LuaScript="%ПОЛНЫЙ ПУТЬ К ИСПОЛНЯЕМОМУ ФАЙЛУ%\lua5.1.exe" "%1" %* (lua5.1.exe устанавливается вместе с Luarocks по умолчанию и называется почему-то именно так, а не иначе, но можно поставить и что-нибудь посвежее). Файловые ассоциации не используют переменные окружения, так что путь необходимо прописывать полностью.