Выложил в open-source свою первую утилиту на Rust (сама утилита работает для любых ЯП). Посмотрите, может кому пригодится, рад советам и пожеланиям.https://github.com/igor-petruk/scriptisto
Почему это полезно тут - https://github.com/igor-petruk/scriptisto/wiki
Если кратко, создаем файл на любом компилируемом языке, в комментарии пишем иструкции по сборке. Например С с зависимостью на glib:
#!/usr/bin/env scriptisto
#include <stdio.h>
#include <glib.h>// scriptisto-begin
// script_src: main.c
// build_cmd: clang -O2 main.c `pkg-config --libs --cflags glib-2.0` -o ./script
// scriptisto-endint main(int argc, char *argv[]) {
gchar* user = g_getenv("USER");
printf("Hello, C! Current user: %s\n", user);
return 0;
}Потом
$ chmod +x ./script.c
$ ./script.c
Hello, C! Current user: usernameПоследующие запуски будут очень быстрые, так как исполняемый файл кеширован.
С утилитой доступно множество шаблонов для разных ЯП.
На новость не тянет, потому что утилита небольшая. Это немного реклама - да, но некоммерческая, просто хотел поделиться может будет полезно, как было полезно мне.
>Если кратко, создаем файл на любом компилируемом языке, в комментарии пишем иструкции по сборке.
>#!/usr/bin/env scriptistoхороший пример, а если я захочу его с помощью gcc скомпилировать, то он не обидится на такой shebang?
тут https://hackaday.com/2019/09/17/linux-fu-shell-scripts-in-c-.../ и тут https://coderwall.com/p/e1htcg/self-compiling-source-code это хотя бы учитывают и обходятся без раста
>>Если кратко, создаем файл на любом компилируемом языке, в комментарии пишем иструкции по сборке.
>>#!/usr/bin/env scriptisto
> хороший пример, а если я захочу его с помощью gcc скомпилировать, то
> он не обидится на такой shebang?scriptisto по дефолту вытирает shebang в пустую строку перед тем как компилировать. Не удаляет, чтобы номера строк в сообщениях об ошибке не поплыли, а просто делает ее пустой. Это не очень хорошо только в Go, есть опция чтобы заменять на что-то другое, совместимое с яп, например на комментариий // как в Go.
В рамках вот этой Issue я хочу сделать трансформирование скрипта в реальный проект если вам это нужно (например потом, скрипт становится все больше и больше) - https://github.com/igor-petruk/scriptisto/issues/10
> тут https://hackaday.com/2019/09/17/linux-fu-shell-scripts-in-c-.../
> и тут https://coderwall.com/p/e1htcg/self-compiling-source-code это хотя бы учитывают
> и обходятся без растаНасчет "//" - если у вас работает такой shebang, нету проблем чтобы использовать его и scriptisto.
Насчет этих статей - нужно чуть больше строк чтобы обеспечить кеширование, иначе перекомпиляция будет каждый раз.
>В рамках вот этой Issue я хочу сделать трансформирование скрипта в реальный проектт.е. если я захочу поделиться своим "скриптом", то я либо должен не забыть вытереть shebang, либо распространять его вместе в бинарником, либо убедить человека поставить раст (и все это чтобы меня не обматерили).
>Насчет этих статей - нужно чуть больше строк
bash/dash у меня уже есть, а вот раста нет. Да и строк у вас достаточно.
>scriptisto по дефолту вытирает shebang в пустую строку перед тем как компилировать.Можно/лучше было вообще сделать что-то вроде генератора run-файлов (или типа распаковщиков от gog)
>>В рамках вот этой Issue я хочу сделать трансформирование скрипта в реальный проект
> т.е. если я захочу поделиться своим "скриптом", то я либо должен не
> забыть вытереть shebang, либо распространять его вместе в бинарником,Ну смотря что значит распространять. Если вы распространяете среди ваших машин где установлен scriptisto, тогда достаточно одного файла.
Я больше говорил о фиче, когда вам надоело это держать в форме скрипта И я реализую ту фичу, то можно будет условно говоря выполнить scriptisto export и он создаст нормальный проект, без себя, без shebang, но с обычным Makefile. Уже от этого сможете дальше развивать ваше приложение.
А пока это просто удобная штука для локалхоста чтобы не возиться с системами сборки для простых скриптов.
> либо убедить человека поставить раст (и все это чтобы меня не обматерили).
Ну я утилиту выпустил всего вчера. Потому легче всего мне ее распространять через crates.io. Но если ее опакетить для дистрибутивов, то бинарнику не нужен Rust. Я разберусь как это сделать и попытаюсь засунуть это в дистрибутивы.
В качестве компромисса могу собирать статические бинарники с musl и выкладывать на Github наверное в релизы в tar.gz.
>>Насчет этих статей - нужно чуть больше строк
> bash/dash у меня уже есть, а вот раста нет. Да и строк
> у вас достаточно.
>>scriptisto по дефолту вытирает shebang в пустую строку перед тем как компилировать.
> Можно/лучше было вообще сделать что-то вроде генератора run-файлов (или типа распаковщиков
> от gog)Я подумаю над такой фичей, наверное в рамках export
>>В рамках вот этой Issue я хочу сделать трансформирование скрипта в реальный проект
> т.е. если я захочу поделиться своим "скриптом", то я либо должен не
> забыть вытереть shebang, либо распространять его вместе в бинарником, либо убедить
> человека поставить раст (и все это чтобы меня не обматерили).Все, я исправил ситуацию. Теперь каждый релиз собирает статический бинарник на общественном сервере и выкладывает на Github.
В логах CI можно увидеть контрольную сумму бинарного файла чтобы быть уверенным что он оттуда.
Сборщик https://cloud.drone.io/igor-petruk/scriptisto
Релизы https://github.com/igor-petruk/scriptisto/releases
Добавил deb, rpm пакеты для основных дистрибутивов, а также просто релиз со статически линкованым исполняемым файлом. Тоже собираются автоматически
Добавил сборку статических исполняемых файлов внутри Docker, без компиляторов в хостовой системе