Сводка командной строки
В рамках работы с рабочими пространствами Cargo выполняет унификацию функций: https://doc.rust-lang.org/cargo/reference/features.html#feature-unification
Что это значит?
Предположим, у вас есть рабочее место
[ workspace ]
members = [ " mega " , " potato " ]
С двумя участниками: mega
[ package ]
name = " mega "
[ dependencies ]
potatoer = { version = " 0.2.1 " , features = [ " mega " ] }
И potato
[ package ]
name = " potato "
[ dependencies ]
potatoer = { version = " 0.2.1 " , features = [ " potato " ] }
Оба из них зависят от обычного стороннего ящика potatoer
, но с разными функциями: mega
интересует "mega"
функция, potato
интересует "potato"
.
при выполнении разных команд вам в конечном итоге потребуется несколько разных версий ящика potatoer
.
Все команды рабочей области будут использовать версию с унифицированными функциями:
cargo check # this will use potatoer with both "mega" and "potato"
Команды, работающие в одном крейте, будут использовать версии без унификации:
cargo check -p mega # this will use potatoer with "mega" feature
cargo check -p potatoer # this will use potatoer with "potato" feature
cargo check -p mega -p potato # this will require both "mega" and "potato"
Если зависимости с необходимой комбинацией нет — груз скомпилирует ее.
Один из способов избежать этой проблемы — убедиться, что если члены рабочей области зависят от крейта, они зависят от него с тем же набором функций. Поддержание его вручную чревато ошибками, и именно тогда на помощь приходят hackerman hack
и hackerman restore
.
При использовании с опцией --lock
hackerman
возьмет контрольную сумму всех зависимостей и сохранит ее в файле Cargo.toml
в папке ["package.metadata.hackerman.lock"]
а последующие вызовы проверки подтвердят, что эта контрольная сумма все еще действительна. .
Это необходимо для того, чтобы убедиться, что исходные (невзломанные) зависимости сохранены и могут быть восстановлены позже.
Опцию --lock
можно жестко запрограммировать в файле Cargo.toml
, который определяет рабочую область:
[ workspace . metadata . hackerman ]
lock = true
На данный момент унификация выполняется только для текущей цели и без поддержки кросс-компиляции. Автоматическое обновление файлов toml рабочей области может не работать, если вы указываете зависимости, используя синтаксис, отличный от версии или {}
:
potato = " 3.14 " # this is okay
banana = { version = " 3.14 " } # this is also okay
Устраняет конфликты слияния и перебазирования для файлов Cargo.toml
измененных хакером.
Чтобы использовать его, вам нужно что-то вроде этого
глобальный .gitconfig
или локальный .git/config
.
[merge "hackerman"]
name = merge restored files with hackerman
driver = cargo hackerman merge %O %A %B %P
gitattributes
, может быть локальным для каждого проекта или глобальным.
Cargo.toml merge=hackerman
Чтобы создать глобальный файл gitattributes
, вам необходимо указать путь к нему внутри глобальной конфигурации git:
[core]
attributesfile = ~/.gitattributes
Здесь я сравниваю влияние различных подходов к унификации рабочего пространства. Без каких-либо изменений чистая проверка всего рабочего пространства, включающая компиляцию всех внешних зависимостей, занимает 672 секунды.
Рабочая область содержит кучу ящиков, из которых я выбрал ящики a
, b
, c
и т. д., так что ящик b
импортирует ящик a
, ящик c
импортирует ящик b
и т. д. ящик a
не содержит внешних зависимостей, в отличие от других ящиков.
cargo hackerman hack
, и в каждый ящик добавляются новые зависимости.Перед запуском команды я очищаю результаты компиляции, а затем последовательно команды для каждого столбца.
команда | нет взлома | хакерман | ручной взлом |
---|---|---|---|
check -pa | 0,86 с | 0,80 с | 215,39 с |
check -pb | 211.30с | 240,15 с | 113,56 с |
check -pc | 362,69 с | 233,38 с | 176,73 с |
check -pd | 36,16 с | 0,24 с | 0,25 с |
check -pe | 385,35 с | 66,34 с | 375,22 с |
check | 267,06 с | 93,29 с | 81.50с |
общий | 1263,42 | 634,20 | 962,65 |
cargo hackerman
↴cargo hackerman hack
↴cargo hackerman restore
↴cargo hackerman check
↴cargo hackerman merge
↴cargo hackerman explain
↴cargo hackerman dupes
↴cargo hackerman tree
↴cargo hackerman show
↴ Коллекция инструментов, которые помогут быстро компилировать ваше рабочее пространство.
Использование : cargo hackerman
COMMAND ...
Доступные варианты:
-h
, --help
— Выводит справочную информацию-V
, --version
— Распечатывает информацию о версииДоступные команды:
hack
— унифицировать зависимости крейтов между отдельными крейтами в рабочей области.restore
— Удалить унификацию зависимостей ящика, добавленную командой hack
.check
— Проверяет, требуется ли унификация и верны ли контрольные суммы.merge
— восстановить файлы и объединить их с драйвером слияния по умолчанию.explain
— Объясните, почему присутствует некоторая зависимость. И функция, и версия не являются обязательными.dupes
— выводит список всех дубликатов в рабочей области.tree
— Создайте дерево из зависимостейshow
— Показать манифест крейта, файл readme, репозиторий или документацию. Вы можете передать --help
дважды для получения более подробной помощи.
Унифицируйте зависимости крейтов между отдельными крейтами в рабочей области.
Использование : cargo hackerman
hack
CARGO_OPTS
[ --dry
] [ --lock
] [ -D
]
Вы можете отменить эти изменения, используя cargo hackerman restore
.
Варианты груза:
--manifest-path
= PATH
— Путь к файлу Cargo.toml--frozen
— Требовать актуальность Cargo.lock и кэша--locked
— Требовать актуальность Cargo.lock--offline
— Запустить без доступа к сети-v
, --verbose
— увеличить детализацию, можно использовать несколько разДоступные варианты:
--dry
— Не выполнять действие, только отображать его
--lock
— Включить контрольную сумму зависимостей в тайник
Это помогает гарантировать, что вы сможете вернуться к исходным (невзломанным) зависимостям: чтобы иметь возможность восстановить исходные зависимости, хакеру необходимо спрятать их в файле Cargo.toml
. Если CI обнаруживает несоответствие контрольной суммы, это означает, что зависимости были обновлены на взломанных источниках. Вместо этого вам следует восстановить их, обновить и снова взломать.
Вы можете заблокировать поведение по умолчанию, добавив это в Cargo.toml
в рабочей области.
[workspace.metadata.hackerman]
lock = true
-D
, --no-dev
— Не унифицировать зависимости разработчиков
-h
, --help
— Выводит справочную информацию
cargo-hackerman hack
вычисляет и добавляет минимальный набор дополнительных зависимостей ко всем членам рабочей области, так что функции всех зависимостей этого ящика остаются неизменными, когда он используется как часть всего рабочего пространства или сам по себе.
Если зависимости взломаны, вам следует восстановить их, прежде чем вносить какие-либо изменения.
Удалить унификацию зависимостей ящиков, добавленную командой hack
.
Использование : cargo hackerman
restore
CARGO_OPTS
[ TOML
]...
Варианты груза:
--manifest-path
= PATH
— Путь к файлу Cargo.toml--frozen
— Требовать актуальность Cargo.lock и кэша--locked
— Требовать актуальность Cargo.lock--offline
— Запустить без доступа к сети-v
, --verbose
— увеличить детализацию, можно использовать несколько разДоступные позиционные предметы:
TOML
— восстановление отдельных файлов вместо всего рабочего пространства.Доступные варианты:
-h
, --help
— Выводит справочную информацию Проверьте, требуется ли унификация и верны ли контрольные суммы
Аналогично cargo-hackerman hack --dry
, но также устанавливает статус выхода на 1, чтобы вы могли использовать его как часть процесса CI.
Использование : cargo hackerman
check
CARGO_OPTS
[ -D
]
Варианты груза:
--manifest-path
= PATH
— Путь к файлу Cargo.toml--frozen
— Требовать актуальность Cargo.lock и кэша--locked
— Требовать актуальность Cargo.lock--offline
— Запустить без доступа к сети-v
, --verbose
— увеличить детализацию, можно использовать несколько разДоступные варианты:
-D
, --no-dev
— Не унифицировать зависимости разработчиков-h
, --help
— Выводит справочную информацию Восстановите файлы и объедините их с драйвером слияния по умолчанию.
Использование : cargo hackerman
merge
BASE
LOCAL
REMOTE
RESULT
Доступные варианты:
-h
, --help
— Выводит справочную информацию Чтобы использовать его, вы должны добавить что-то вроде этого в ~/.gitconfig
или .git/config
[merge "hackerman"]
name = merge restored files with hackerman
driver = cargo hackerman merge %O %A %B %P
И что-то вроде этого в .git/gitattributes
Cargo.toml merge=hackerman
Объясните, почему существует определенная зависимость. И функция, и версия не являются обязательными.
Использование : cargo hackerman
explain
CARGO_OPTS
[ -T
] [ -P
] [ -s
] CRATE
[ FEATURE
] [ VERSION
]
Варианты груза:
--manifest-path
= PATH
— Путь к файлу Cargo.toml--frozen
— Требовать актуальность Cargo.lock и кэша--locked
— Требовать актуальность Cargo.lock--offline
— Запустить без доступа к сети-v
, --verbose
— увеличить детализацию, можно использовать несколько разДоступные варианты:
-T
, --no-transitive-opt
— Не удалять избыточные ссылки-P
, --package-nodes
— Использовать узлы пакетов вместо узлов функций.-s
, --stdout
— Распечатать файл с точками на стандартный вывод вместо создания xdot
-h
, --help
— Выводит справочную информациюПри большом количестве зависимостей может быть сложно определить, почему именно включена какая-то под-под-под-зависимость. hackerman объяснить решает эту проблему, отслеживая цепочку зависимостей от цели до рабочей области.
explain
начинается с заданного крейта/функции и следует по ссылкам обратной зависимости, пока не достигнет всех точек пересечения с рабочей областью, но без входа в саму рабочую область.
Белые узлы представляют элементы рабочей области, круглые узлы представляют объекты, восьмиугольные узлы представляют базовые ящики. Пунктирная линия представляет зависимость только для разработчиков, пунктирная линия — как для разработчиков, так и для обычных, но с разными функциями. Цель обычно подсвечивается. По умолчанию hackerman расширяет узлы функций информации о пакетах, которые можно отменить с помощью -P
и пытается уменьшить транзитивные зависимости, чтобы дерево было более читабельным - это можно отменить с помощью -T
.
Если крейт присутствует в нескольких версиях, вы можете указать версию интересующей вас версии, но это необязательно.
Вы также можете указать, какую функцию искать, иначе хакерман будет искать их все.
Перечисляет все дубликаты в рабочей области.
Использование : cargo hackerman
dupes
CARGO_OPTS
Варианты груза:
--manifest-path
= PATH
— Путь к файлу Cargo.toml--frozen
— Требовать актуальность Cargo.lock и кэша--locked
— Требовать актуальность Cargo.lock--offline
— Запустить без доступа к сети-v
, --verbose
— увеличить детализацию, можно использовать несколько разДоступные варианты:
-h
, --help
— Выводит справочную информацию Сделать дерево из зависимостей
Использование : tree
cargo hackerman
CARGO_OPTS
[ -T
] [ -D
] [ -P
] [ -w
] [ -s
] [ CRATE
] [ FEATURE
] [ VERSION
]
Варианты груза:
--manifest-path
= PATH
— Путь к файлу Cargo.toml--frozen
— Требовать актуальность Cargo.lock и кэша--locked
— Требовать актуальность Cargo.lock--offline
— Запустить без доступа к сети-v
, --verbose
— увеличить детализацию, можно использовать несколько разДоступные варианты:
-T
, --no-transitive-opt
— Не удалять избыточные ссылки-D
, --no-dev
— Не включать зависимости от разработчиков-P
, --package-nodes
— Использовать узлы пакетов вместо узлов функций.-w
, --workspace
— Оставаться в рабочей области-s
, --stdout
— Распечатать файл с точками на стандартный вывод вместо создания xdot
-h
, --help
— Выводит справочную информациюПримеры:
cargo hackerman tree rand 0.8.4
cargo hackerman tree serde_json preserve_order
Показать манифест крейта, файл readme, репозиторий или документацию
Использование : cargo hackerman
show
CARGO_OPTS
[ -m
| -r
| -d
| -R
] CRATE
[ VERSION
]
Варианты груза:
--manifest-path
= PATH
— Путь к файлу Cargo.toml--frozen
— Требовать актуальность Cargo.lock и кэша--locked
— Требовать актуальность Cargo.lock--offline
— Запустить без доступа к сети-v
, --verbose
— увеличить детализацию, можно использовать несколько разДоступные варианты:
-m
, --manifest
— Показать манифест ящика-r
, --readme
— Показать файл readme-d
, --doc
— URL-адрес открытия документации-R
, --repository
— Репозиторий-h
, --help
— Выводит справочную информациюПримеры:
cargo hackerman show --repository syn