Могу ли я помешать грузу перестраивать библиотеки с каждым новым проектом?

Предположим, я выполняю cargo new one --bin а также cargo new two --bin затем добавить ту же зависимость для каждого проекта Cargo.toml и построить их.

Теперь есть два абсолютно идентичных набора библиотек:

/ one / target / debug / deps / *.rlib

/ two / target / debug / deps / *.rlib

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

Можно ли указать место для хранения скомпилированных библиотек, чтобы избежать перекомпиляции?

3 ответа

Несколько проектов Cargo могут совместно использовать библиотеки, используя один и тот же целевой каталог.

.cargo / конфигурации

Поместите папку ".cargo" в проект и создайте там файл "config", содержащий:

[build]
target-dir = "/path/to/your/shared/target/dir"

В Unix это может выглядеть так:

mkdir ~/shared_rust_target
mkdir .cargo
echo "[build]" > .cargo/config
echo "target-dir = \"$HOME/shared_rust_target\"" >> .cargo/config

CARGO_TARGET_DIR

Установить CARGO_TARGET_DIR переменная окружения.

В Unix это может выглядеть так:

export CARGO_TARGET_DIR = "$HOME/shared_rust_target"

Смотрите этот коммит для некоторых дополнительных target-dir документация.

В частности, до Cargo 1.9 не следует одновременно создавать несколько проектов в одной целевой директории. ( Подробнее о том, как Cargo 1.9 поддерживает параллельные сборки).

target-dir также упоминается в документе Cargo.

Обратите внимание, что лично я использую только target-dir Возможность перенаправить сборки в другое место, поэтому я никогда не пытался делать общие сборки. Но это должно работать, в соответствии с этим вопросом.

Даже если есть способ сделать это, вы, вероятно, не хотите. То, что вы используете одни и те же библиотеки, не означает, что они были скомпилированы одинаково. Например, Cargo поддерживает концепцию функций, конфигурацию времени компиляции, которая изменяет способ компиляции ящика.

Точно так же вам может потребоваться поддержка нескольких версий Rust, например, ночных и стабильных. Или, возможно, вам нужно кросс-компиляции для другой архитектуры. Каждый из них будет производить другой код.

Cargo будет кешировать продукты сборки одного проекта, поэтому я считаю, что накладные расходы не очень заметны, и я собираю множество проектов от людей, задающих вопросы о переполнении стека!:-)

Мне удалось собрать код из нескольких ответов, но в основном из этого. Этот Dockerfile должен кэшировать не только загрузки зависимостей Cargo, но и их компиляции и индекс crates.io. Все остальные ответы, которые я мог найти, кэшировали только загрузки или индекс, а не оба.

      FROM arm64v8/rust as builder

# Capture dependencies
COPY Cargo.toml Cargo.lock /app/

# We create a dummy main.rs to build deps
WORKDIR /app
RUN mkdir src && echo "fn main() {}" > src/main.rs
# RUN rustup install nightly && rustup default nightly

# This step compiles only our dependencies and saves them in a layer. This is the most impactful time savings
# Note the use of --mount=type=cache. On subsequent runs, we'll have the crates already downloaded
RUN --mount=type=cache,target=/usr/local/cargo/registry cargo build --release && rm src/main.rs

# Copy our sources
COPY ./src /app/src

# A bit of magic here!
# * We're mounting that cache again to use during the build, otherwise it's not present and we'll have to download those again - bad!
# * Rust here is a bit fiddly, so we'll touch the files (even though we copied over them) to force a new build
RUN --mount=type=cache,target=/usr/local/cargo/registry \
    set -e && \
    # update timestamps to force a new build &&
    touch /app/src/main.rs && \
    cargo build --release

# Again, our final image is the same - a slim base and just our app
FROM debian:buster-slim as app
COPY --from=builder /app/target/release/app/app
CMD ["/app"]

Обратите внимание на FROM arm64v8, если вы ориентируетесь на x86, замените builderа также appFROM с их соответствующими версиями x86.

Другие вопросы по тегам