Сборки вне исходного кода (внешний каталог сборки) с Cargo?

Пользуясь CMake, я привык к сборкам вне исходного кода, которые поощряются с помощью CMake. Как можно делать сборки вне исходного кода с помощью Cargo?


Снова использование in-source-builds похоже на шаг назад:

  • Инструменты разработки должны быть настроены так, чтобы игнорировать пути. Иногда несколько плагинов и инструментов разработки - особенно с использованием VIM или Emacs!
  • Некоторые инструменты нельзя настроить так, чтобы легко скрывать файлы сборки. Хотя точечные файлы обычно скрыты, они все равно будут отображать Cargo.lock и target/, что еще хуже, рекурсивно раскрывая свое содержимое.
  • Удаление не отслеживаемых файлов для удаления всего, что не контролируется версией, обычно для очистки временных файлов редактора или некоторых тестовых выходных данных может иметь неприятные последствия, если вы забыли добавить новый файл в систему контроля версий и не вручную проверяли список файлов перед их удалением.
  • Зависимости загружаются в ваш путь к исходному коду, иногда добавляя *.rs файлы в target каталог как часть построения косвенных зависимостей, поэтому работа со всеми *.rs файлами может случайно выбрать другие файлы, которые не находятся в скрытом каталоге, поэтому их нельзя игнорировать даже после настройки средств разработки.

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


person ideasman42    schedule 22.12.2016    source источник


Ответы (2)


Вы можете указать каталог папки target/ через файл конфигурации (ключ _2 _) или переменная среды (CARGO_TARGET_DIR). Вот пример использования файла конфигурации:

Предположим, вам нужен каталог ~/work/, в котором вы хотите сохранить проект Cargo (~/work/foo/), а рядом с ним целевой каталог (~/work/my-target/).

$ cd ~/work
$ cargo new --bin foo
$ mkdir .cargo
$ $EDITOR .cargo/config

Затем вставьте в файл конфигурации следующее:

[build]
target-dir = "./my-target"

Если вы затем создадите свой обычный каталог проекта Cargo:

$ cd foo
$ cargo build

Вы заметите, что директории target/ нет, но все находится в ~/work/my-target/.


Однако Cargo.lock по-прежнему сохраняется в каталоге проекта Cargo, но в этом есть смысл. Для исполняемых файлов: вам следует проверить Cargo.lock файл в своем git! Для библиотек не нужно. Думаю, лучше игнорировать один файл, чем игнорировать всю папку.

Наконец, есть несколько предостережений относительно изменения target-dir, которые перечислены в PR, который представил функцию.

person Lukas Kalbertodt    schedule 22.12.2016

Хотя полезная настройка вручную не так уж и удобна, я хотел иметь возможность создавать несколько ящиков в дереве исходных текстов, имея все они вне источника, чего не удалось бы достичь с помощью параметра конфигурации ../target-dir.


Утилита-помощник для удобных сборок вне исходного кода

Используя переменную среды , я написал небольшую утилиту для упаковки груза, поэтому она автоматически строится -of-source, поддерживающий ящики как на верхнем уровне, так и в подкаталоге дерева исходных текстов.


Спасибо Лукасу за указание на CARGO_TARGET_DIR и target-dir вариант конфигурации.

person ideasman42    schedule 22.12.2016