Ночные сборки Cargo перестанут дублировать метаданные — каталог сборки станет меньше
18.08.2026На ночных сборках Cargo включает по умолчанию параметр, уменьшающий каталог сборки. Для крупных проектов разница заметная — у Cargo самого каталог в профиле выпуска сжимается примерно на треть.
Откуда берётся лишнее место
Сборка идёт конвейерно: как только зависимость собрана, с неё нужно взять сведения о типах, чтобы начать собирать зависящие от неё крейты. Для этого компилятор выпускает отдельный файл с одними метаданными.
Финальный же файл содержит и код, и те же метаданные. То есть на диске они лежат дважды — и объём, который занимает каталог сборки, завышен.
Что измеряли
Для Cargo самого в профиле выпуска без инкрементальной сборки каталог сжимается примерно на треть — в абсолютных числах около трёхсот мегабайт.
В настройках по умолчанию для разработки выигрыш скромнее: пять — восемь процентов. Там объём съедают отладочная информация и артефакты инкрементальной сборки, а не метаданные.
Оговорка про ручную линковку
Тем, кто сам линкует файлы крейтов, придётся передавать компилятору ещё и файл с метаданными. Иначе доступ к сведениям о типах крейта будет потерян.
Найти его непросто: он не поднят в корне каталога сборки, а остался во вложенных каталогах, и искать его придётся через машинный вывод Cargo.
Сборка не через Cargo не затронута вовсе.
Положение дел
Это эксперимент, а не путь к стабилизации: решение о судьбе параметра примут после сбора отзывов с ночных сборок. Вернуть прежнее поведение можно тремя способами — флагом, переменной окружения или записью в настройках проекта.
Оригинал
TL;DR: The Cargo Team will be rolling out an experiment to identify user impact for a proposed change. Cargo will enable the -Zembed-metadata=no feature on the nightly channel by default, which can help reduce the size of the target directory somewhat.
Note that this is an experiment, the feature is not currently headed for stabilization.
In the vast majority of situations, you should not notice anything different when -Zembed-metadata=no is used, other than the target directory becoming smaller. However, if you for some reason link to .rlib files manually, you might now also have to pass the corresponding .rmeta file to the compiler using the --extern flag.
Упоминаний: 1 · Просмотров: 3