Консольный менеджер задач

#cli #rust

Много лет использую различные менеджеры задач, в которых фиксирую задачи. Но есть определенный круг задач, специфичный строго для определенных проектов. И их проще всего вести не общем списке, а хранить вместе с исходным кодом.

И вот тут на помощь приходят текстовые файлы и новый, довольно обширный круг менеджеров задач. Остановил свой выбор на sjl/t , менеджере от Steve Losh.

Менеджер, написанный на Python, управляется через командную строку. Полное описание приводиться на странице проекта в README, а я хотел бы остановиться на его недостатках.

  1. Написан на Python, и то есть работает только там, где установлен интерпретатор и где подготовлена система зависимостей. С одной стороны это не проблема, но установка потребует дополнительных телодвижений, особенно если вы работаете на Windows.

  2. Для идентификации задач используется хеширование SHA-1, что приводит к возможным колизиям и что потребовало от Стива добавление дополнительных проверок на корректность расчетов.

  3. Формат текстового файла подразумевает наличие как текста, так и его хеша, что не совсем удобно, если нужно поправить список задач напрямую через файл.

В результате решил написать свою версию менеджера задач. Во-первых, это должен был быть бинарный файл. Чтобы можно было просто скопировать его на свой компьютер и начать использовать. Бинарник, который не зависит от его окружения. Во-вторых, использовать для хеширования более надежное решение в виде SHA-256. И в-третьих, убрать из файла сам хеш.

Если задуматься, хеш в файле не нужен совершенно. При запуске программы производиться расчет хеша для каждой из задач, производиться это настолько быстро, что не замечаешь изменений. И хранить при этом хеш в файле оказывается совершенно не нужно.

После того, как определился с тем, что решаю и как, стал выбирать язык программирования. Всегда очень любил C++, восхищался им. Поэтому написал первую версию juev/t именно на нем.

Но мне нужно было не только написать программу, но и собрать ее для различных систем, чтобы была полноценная кросс-платформенность. Вот тут мне пришлось изрядно попотеть.

Как оказалось, C++17 стандарт сложно использовать в Github Actions, по крайней мере потратив изрядное количество времени мне так и не удалось собрать программу на ubuntu и windows. Если правильно понимаю, проблема заключалась именно в параметрах запуска Cmake. И нужно было дополнительно определять используемый компилятор, размещение его запускныз файлов. Кое-как собрал бинарники для macOS и Linux, опубликовал и задумался.

Думал не долго, и решил переписть менеджер на Rust. Почему не на Golang спросите вы? Golang простой язык и писать программы на нем одно удовольствие. Но бинарники при этом получаются довольно объемные. В случае с этим менеджером получал бинарные файлы в несколько мегебайт. Для прикладных программ имхо это перебор.

Итак, Rust. Версию 2.0.0 реализовал полностью на Rust, немного доработал процесс публикации и в версии 2.0.1 реализовал сборку для всех основных операционных систем с оптимизацией по размеру бинарника. При этом на доработку процесса сборки потратил немного времени, совсем немного, если сравнивать со временем, которое потратил на разборки со сборкой C++17 проекта.

Помимо всех возможностей оригинальной sjl/t , моя версия так же умеет работать с группой задач, которые передаются через запятую. При этом изменился формат файла, как писал выше, убрал из файла описание хеша. Что поломало совместимость с оригинальным менеджером. И если у вас есть файлы созданные с его помощью, не удаться их использовать с моей программой. Но по сути, это единственный недостаток, который быстро решается ручной правкой.

Надеюсь, что мой менеджер задач juev/t окажется полезным и вам. И если у вас будут возникать вопросы, или предложения, смело заводите issue .