Перечитывая документацию к dub, натолкнулся на одну интересную вещь, которая позволяет использовать dub для написания небольших приложений или скриптов. Дело в том, что в dub есть специальный режим для того случая, когда вся программа помещается в одном файле с исходным кодом, а это в свою очередь позволяет расширить сферу применения этого инструмента.
Таким образом, если есть один файл с исходным кодом, то «рецепт» для его сборки может быть помещен прямо в файл с исходным кодом в виде особой строки комментария. Этот комментарий в сочетании с синтаксисом shebang, применяемом для создания исполняемых файлов из обычных текстовых файлов с исходным кодом, позволяет сделать скрипт, который при этом сам себя скомпилирует и добавит нужные зависимости при необходимости.
Вот простой пример с библиотекой dlib:
#!/usr/bin/env dub /+ dub.sdl: name "exp" dependency "dlib" version="~>0.17.0" +/ void main() { import dlib.image; auto img = image(512, 512); foreach (i; 0..512) { img[i, i] = Color4f(0.5f, 0.5f, 0.9f); } img.savePNG(`test.png`); }
Теперь достаточно просто сделать файл с этим исходным кодом исполняемым и dub автоматически установит зависимости и запустит скрипт на исполнение прямо из командной оболочки Linux !
Команда запуска в Linux:
./dub_exp.d
А что если мы хотим просто собрать приложение из одного файла, а не запускать его ?
Тогда, необходимо вызвать dub для сборки с единственным файлом, используя ключ пакетного менеджера —single:
dub build --single <имя_файла>
Также, допускается и сокращенная форма данной команды, которая просто позволяет опустить данный флаг и указать необходимый файл с кодом. Подобное верно не только для команды сборки build, но и для команды выполнения run, которая в добавление ко всему вышеописанному предоставляет возможность после имени файла указать аргументы командной строки, переадресуемые в само приложение.
Понимаю, что рецепт скромный, но иногда документация реально позитивно впечатляет…
P.S: Данный метод не сработает для создания библиотек из одного файла с исходным кодом.