По умолчанию
А препроцессировать его придётся. Ввиду того, что вывод
Кстати, насчёт зависимостей: у
Ещё один из дефолтов
Теперь немного о самом процессе проверки. Вывод
Именно это значение нам и надо сохранить. Можно также считать разными зависимости несовместимых версий, но это несколько менее удобно в обработке (код не проверял):
Надо отметить, что в этом случае в списке будут не только сами зависимости, но и их версии, что может создать неудобства при их обновлении.
Насчёт обработки списков: сигнализировать об ошибке стоит не только в том случае, если есть дубликат вне зафиксированного списка, но и в том случае, если зависимость вне фиксированного списка отсутствует в выдаче
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
. Это позволяет поддерживать список в актуальном, не врущем состоянии. ⬇️🔥5❤2
Насчёт формата списка дубликатов: так как вы всё равно парсите его самостоятельно, имеет смысл добавить туда поддержку комментариев. Это позволяет писать, почему дубликаты ещё не убраны, и при необходимости записывать ссылки на блокеры. Также это позволяет сделать список самодокументируемым: можно записать в начале, для чего этот список нужен, какой у него формат, как запустить проверку дубликатов и как при необходимости вносить исправления (можно даже немного угореть по сопровождаемости и требовать комментарий с объяснением у каждой зависимости). Лично я у себя записываю список в наиболее, наверное, простом виде — по имени на строку — поэтому я сделал комментариями строки, которые начинаются с
И ещё небольшой момент. В основном репозитории Rust в корне есть инструмент
К чему я это всё? Имеет смысл добавить в данный код функциональность для безусловного перезаписывания списка. Разумеется, она должна быть немного более сложной, чем просто запись поверх, потому что иначе она будет перетирать комментарии. Лично я для своего формата поступил следующим образом:
Функция получает на вход набор новых дубликатов и набор более-не-дубликатов. Сначала я считываю список целиком и разбиваю его на строки. Затем я прохожу по нему и для строк с именами зависимостей добавляю номер строки в набор удаляемых строк, если имя зависимости присутствует в наборе более-не-дубликатов. После этого я снова открываю файл с
Вы, вероятно, скажете, что отслеживать номера излишне, поскольку можно просто проверять строки во время вывода с набором удалённых дубликатов. Так и есть. Но дело в том, что я делаю немного больше и удаляю не только строки с дубликатами, но и непосредственно предшествующие им строки с комментариями. Это решение я обосновываю тем, что если перед именем зависимости есть комментарий, то он наверняка объясняет, почему эта зависимость присутствует в списке дубликатов, а потому при удалении зависимости этот комментарий более неактуален и может ввести в заблуждение.
И последний момент: нужно как-то прокидывать информацию о том, что тест должен обновить список. Использование аргументов командной строки не выглядит хорошей (и удобной) идеей, поэтому мой код обновляет список, если выставлена определённая переменная окружения. Имя этой переменной, разумеется, есть в комментариях в списке дубликатов.
#
. И ещё небольшой момент. В основном репозитории Rust в корне есть инструмент
x.py
, который позволяет коротко выполнять важные в контексте разработки задачи — в частности, запускать тесты. В репозитории Rust есть куча UI тестов, которые проверяют, что компилятор выдаёт на проблемы с кодом диагностики в ожидаемом формате. Создавать файлы с ожидаемым форматом вручную неудобно — особенно с учётом того, что формат для ожидаемого вывода абстрагируется от конкретных номеров строк — поэтому у x.py test
есть опция --bless
, которая перезаписывает ожидаемый вывод указанного теста реальным выводом компилятора. Эта опция также пригождается, когда вносится изменение в код для вывода диагностик — это позволяет избежать внесения изменений в ожидаемый вывод вручную.К чему я это всё? Имеет смысл добавить в данный код функциональность для безусловного перезаписывания списка. Разумеется, она должна быть немного более сложной, чем просто запись поверх, потому что иначе она будет перетирать комментарии. Лично я для своего формата поступил следующим образом:
Функция получает на вход набор новых дубликатов и набор более-не-дубликатов. Сначала я считываю список целиком и разбиваю его на строки. Затем я прохожу по нему и для строк с именами зависимостей добавляю номер строки в набор удаляемых строк, если имя зависимости присутствует в наборе более-не-дубликатов. После этого я снова открываю файл с
.truncate(true)
, записываю туда построчно старое содержимое, пропуская строки с номерами из числа удаляемых, и докидываю туда построчно список новых дубликатов.Вы, вероятно, скажете, что отслеживать номера излишне, поскольку можно просто проверять строки во время вывода с набором удалённых дубликатов. Так и есть. Но дело в том, что я делаю немного больше и удаляю не только строки с дубликатами, но и непосредственно предшествующие им строки с комментариями. Это решение я обосновываю тем, что если перед именем зависимости есть комментарий, то он наверняка объясняет, почему эта зависимость присутствует в списке дубликатов, а потому при удалении зависимости этот комментарий более неактуален и может ввести в заблуждение.
И последний момент: нужно как-то прокидывать информацию о том, что тест должен обновить список. Использование аргументов командной строки не выглядит хорошей (и удобной) идеей, поэтому мой код обновляет список, если выставлена определённая переменная окружения. Имя этой переменной, разумеется, есть в комментариях в списке дубликатов.
👍4❤3🔥2
😒🤚 Избавляться от кругов под глазами консилером
😏👉 Избавляться от кругов под глазами хорошим сном
😏👉 Избавляться от кругов под глазами хорошим сном
👏16🥰4🤔2
Купил себе майку (местного производства), а она настолько длинная, что мне почти годится как мини-платье.
И это типа размер S.
И это типа размер S.
🌚8👎1
Блог*
😒🤚 Избавляться от кругов под глазами консилером 😏👉 Избавляться от кругов под глазами хорошим сном
Подписчик прислал ссылку по теме: https://t.iss.one/donttouchmyface/870
Telegram
don't touch my face
Темные круги под глазами - это такая штука, с которой многие пытаются бороться, покупают какие-то кремы в огромных количествах, но в итоге, ничего, кроме разочарования, не испытывают.
Если тёмные круги у вас всю жизнь, то это гены, и справиться с ними не…
Если тёмные круги у вас всю жизнь, то это гены, и справиться с ними не…
Forwarded from Таксики и лытдыбр σποραδικος
В женской консультации почему-то принимает стоматолог. Vagina dentata?
Блог*
#music "Doom is a game where you have a boss music" youtu.be/watch?v=kpnW68Q8ltc
YouTube
Doom Eternal - "The Only Thing They Fear is You"
SHEETS NOW AVAILABLE! https://bit.ly/onlythingtheyfearisyou
AND BFG DIVISION: https://bit.ly/bfgdivisionsheets
New Piano version of "The Only Thing They Fear Is You" - from the Doom Eternal OST Soundtrack, composed by @MickGordon
ALL SHEETS FOR MY POPULAR…
AND BFG DIVISION: https://bit.ly/bfgdivisionsheets
New Piano version of "The Only Thing They Fear Is You" - from the Doom Eternal OST Soundtrack, composed by @MickGordon
ALL SHEETS FOR MY POPULAR…
🔥4🤡1
#prog #haskell #article
Unique sample drawing & searches with List and StateT --- "Send more money"
Или про то, как интерпретация списка как недетерминированного значения позволяет очень ясно записать решение задачи с ограничениями и при этом задействовать ранний бектрекинг.
Unique sample drawing & searches with List and StateT --- "Send more money"
Или про то, как интерпретация списка как недетерминированного значения позволяет очень ясно записать решение задачи с ограничениями и при этом задействовать ранний бектрекинг.
in Code
Unique sample drawing & searches with List and StateT --- "Send more money"
Nothing too crazy today, just a cute (basic/intermediate) haskell trick as a response to Mark Dominus’s excellent Universe of Discourse post on Easy exhaustive search with the list monad intended for people new or unfamiliar with haskell demonstrating the…
❤🔥5🔥1🤡1
Блог*
#gamedev Вы когда-нибудь хотели прогуляться по трёхмерному фракталу? Что ж, теперь вы можете. Всё ещё в разработке, но выглядит потрясающе. https://bananaft.itch.io/yedomaglobula
#game
Трейлер к Fractal sailor — игре от другого разработчика, но со схожими вайбами.
youtu.be/LklRyY_L96c
Трейлер к Fractal sailor — игре от другого разработчика, но со схожими вайбами.
youtu.be/LklRyY_L96c
YouTube
Fractal Sailor - Tech Demo Gameplay Trailer
Play the Tech Demo for free on Win/Mac: https://propagant.itch.io/fractal-sailor
I'm actually working on a full game! Check the early teaser here: https://www.youtube.com/watch?v=uGLIIHsptcY&ab_channel=MatejVanco
Fractal Sailor is an experimental, atmospheric…
I'm actually working on a full game! Check the early teaser here: https://www.youtube.com/watch?v=uGLIIHsptcY&ab_channel=MatejVanco
Fractal Sailor is an experimental, atmospheric…
Forwarded from Random three body problem
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
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