1.84K subscribers
3.27K photos
130 videos
15 files
3.55K links
Блог со звёздочкой.

Много репостов, немножко программирования.

Небольшое прикольное комьюнити: @decltype_chat_ptr_t
Автор: @insert_reference_here
Download Telegram
По умолчанию cargo tree -d показывает не только дубликаты зависимостей, но и зависимые от них крейты. Это удобно для человека, но не особо пригодно для наших целей, когда мы хотим получить только дубликаты и ничего более. Для того, чтобы оставить только нужные нам результаты, можно воспользоваться флагом --depth=0 (доступен с версии cargo 1.54). В этом случае обработка вывода cargo tree будет сведена к минимуму.

А препроцессировать его придётся. Ввиду того, что вывод cargo tree для пользователя, а не для обработки машиной (и потому чисто технически это всё может сломаться с обновлением версии cargo), в нём есть пустые строки (которые отделяют деревья зависимостей друг от друга) и строки, предваряющие разных секции зависимостей, а именно, [build-dependencies] и [dev-dependencies]. Эти строки при обработке вывода нужно убирать.

Кстати, насчёт зависимостей: у cargo tree есть флаг -e/--edges, который указывает, какие именно зависимости показывать. По умолчанию это прямые зависимости, build-зависимости (которые нужны для сборки, но не нужны непосредственно для компиляции исполняемого кода — скажем, генератор кода поверх .proto-файлов) и dev-зависимости (не нужные для сборки, но полезные для разработки — обычно это зависимости для тестов и бенчмарков). Лично меня куда меньше волнует дублирование, вызванное dev-зависимостями, во многом из-за того, что они не компилируются при каждом cargo build/cargo check. Если вы разделяете моё мнение на этот счёт, используйте флаг -e=normal,build.

Ещё один из дефолтов cargo tree — консистентный с остальными командами — по умолчанию код генерируется только для текущей целевой платформы и с фичами проекта по умолчанию. Из-за этого можно упустить дубликаты, которые появляются при компиляции под другие платформы и с другими фичами. Конкретно в моём случае это не является проблемой, поскольку в силу специфики используемых технологий компонент, над которым я работаю, поддерживает только один target triple, а все наши features нужны исключительно для отладки, но, скорее всего, имеет смысл использовать флаги --all-targets и --all-features. Только имейте в виду, что по очевидным причинам это может сильно замедлить скорость проверки.

Теперь немного о самом процессе проверки. Вывод cargo tree выводит имя зависимости вместе с версией. Нам нужно только имя зависимости для исключения дубликатов. К счастью, так как имя пакета не может включать в себя пробел, выделение имени — это просто

let name = line.split_once(' ').unwrap().0;


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

let (name, version) = line.split_once(' ').unwrap();
let version = {
let (major, rest) = version.split_once('.').unwrap();
if major == "v0" {
let minor = rest.split_once('.').unwrap().0;
format!("v0.{minor}")
} else {
major.to_owned()
}
};
// (name, version) используется в качестве ключа


Надо отметить, что в этом случае в списке будут не только сами зависимости, но и их версии, что может создать неудобства при их обновлении.

Насчёт обработки списков: сигнализировать об ошибке стоит не только в том случае, если есть дубликат вне зафиксированного списка, но и в том случае, если зависимость вне фиксированного списка отсутствует в выдаче cargo tree. Это позволяет поддерживать список в актуальном, не врущем состоянии. ⬇️
🔥52
Насчёт формата списка дубликатов: так как вы всё равно парсите его самостоятельно, имеет смысл добавить туда поддержку комментариев. Это позволяет писать, почему дубликаты ещё не убраны, и при необходимости записывать ссылки на блокеры. Также это позволяет сделать список самодокументируемым: можно записать в начале, для чего этот список нужен, какой у него формат, как запустить проверку дубликатов и как при необходимости вносить исправления (можно даже немного угореть по сопровождаемости и требовать комментарий с объяснением у каждой зависимости). Лично я у себя записываю список в наиболее, наверное, простом виде — по имени на строку — поэтому я сделал комментариями строки, которые начинаются с #.

И ещё небольшой момент. В основном репозитории Rust в корне есть инструмент x.py, который позволяет коротко выполнять важные в контексте разработки задачи — в частности, запускать тесты. В репозитории Rust есть куча UI тестов, которые проверяют, что компилятор выдаёт на проблемы с кодом диагностики в ожидаемом формате. Создавать файлы с ожидаемым форматом вручную неудобно — особенно с учётом того, что формат для ожидаемого вывода абстрагируется от конкретных номеров строк — поэтому у x.py test есть опция --bless, которая перезаписывает ожидаемый вывод указанного теста реальным выводом компилятора. Эта опция также пригождается, когда вносится изменение в код для вывода диагностик — это позволяет избежать внесения изменений в ожидаемый вывод вручную.

К чему я это всё? Имеет смысл добавить в данный код функциональность для безусловного перезаписывания списка. Разумеется, она должна быть немного более сложной, чем просто запись поверх, потому что иначе она будет перетирать комментарии. Лично я для своего формата поступил следующим образом:

Функция получает на вход набор новых дубликатов и набор более-не-дубликатов. Сначала я считываю список целиком и разбиваю его на строки. Затем я прохожу по нему и для строк с именами зависимостей добавляю номер строки в набор удаляемых строк, если имя зависимости присутствует в наборе более-не-дубликатов. После этого я снова открываю файл с .truncate(true), записываю туда построчно старое содержимое, пропуская строки с номерами из числа удаляемых, и докидываю туда построчно список новых дубликатов.

Вы, вероятно, скажете, что отслеживать номера излишне, поскольку можно просто проверять строки во время вывода с набором удалённых дубликатов. Так и есть. Но дело в том, что я делаю немного больше и удаляю не только строки с дубликатами, но и непосредственно предшествующие им строки с комментариями. Это решение я обосновываю тем, что если перед именем зависимости есть комментарий, то он наверняка объясняет, почему эта зависимость присутствует в списке дубликатов, а потому при удалении зависимости этот комментарий более неактуален и может ввести в заблуждение.

И последний момент: нужно как-то прокидывать информацию о том, что тест должен обновить список. Использование аргументов командной строки не выглядит хорошей (и удобной) идеей, поэтому мой код обновляет список, если выставлена определённая переменная окружения. Имя этой переменной, разумеется, есть в комментариях в списке дубликатов.
👍43🔥2
😒🤚 Избавляться от кругов под глазами консилером
😏👉 Избавляться от кругов под глазами хорошим сном
👏16🥰4🤔2
Купил себе майку (местного производства), а она настолько длинная, что мне почти годится как мини-платье.

И это типа размер S.
🌚8👎1
В женской консультации почему-то принимает стоматолог. Vagina dentata?
пятничное #vercheniye_academy
👍4🤡3🔥1
Forwarded from Nero's (Nero-sama 🇷🇺)
Чел, который ставит клоунов такой типа
🤡48👍1
🙏11🤡41👍1👎1🥴1
#meme про томбоев и фембоев
Forwarded from Is This an ADHD Thing?
🤔18😁7🌚31
#prog #haskell #article

Unique sample drawing & searches with List and StateT --- "Send more money"

Или про то, как интерпретация списка как недетерминированного значения позволяет очень ясно записать решение задачи с ограничениями и при этом задействовать ранний бектрекинг.
❤‍🔥5🔥1🤡1
Прислал подписчик
😍20😱6🤡4👍1🔥1🤔1🍌1
Папищеки, а посоветуйте игры, пожалуйста. Интересуют игры с упором на сюжет.
🤡6
This media is not supported in your browser
VIEW IN TELEGRAM
Initial states:
m: 6.097 x: 7.280 y: 2.371 vx: 0.087 vy: -0.402
m: 3.707 x: -7.427 y: 8.735 vx: 0.188 vy: -0.131
m: 5.375 x: 1.043 y: 7.741 vx: -0.409 vy: 0.267
Interest-ness score: 56
🤡7🥰6🤯3👍1🔥1