2017-02-09 11 views
5

Есть ли способ сообщить Cargo, чтобы установить и построить все мои зависимости, но не пытаться создать мое приложение?Может ли Cargo загружать и строить зависимости без создания приложения?

Я думал, что cargo install сделает это, но на самом деле это полностью подходит для моего приложения. Я хочу добраться до состояния, в котором cargo build найдет все зависимости, готовые к использованию, но не касаясь каталога /src.


Что я действительно пытаюсь выполнить:

Я пытаюсь построить Docker изображение для приложения ржавчины, где я хотел бы сделать следующие шаги:

время

сборки (docker build .):

  1. импорта грузчиком изображение с ржавчиной оснастки установлен
  2. добавить мои Cargo.toml и Cargo.lock файлы
  3. скачать и построить все зависимости
  4. добавить свой исходный каталог с изображением
  5. построить мой исходный код

время Run (docker run ...):

  1. пройти приложение

Я попытался следующие Dockerfile, но указанный шаг строит мое приложение, а также (что, конечно, не удается, так как исходный каталог пока не существует):

FROM jimmycuadra/rust 

ADD Cargo.toml /source 
ADD Cargo.lock /source 

RUN cargo install # <-- failure here 

ADD src /source/src 
RUN cargo build 

ENTRYPOINT cargo run 

Поэтому я хочу, чтобы отделить установки зависимостей шаг от создания моего приложения, заключается в том, что если я не изменю зависимости, я хочу, чтобы Docker мог использовать кэшированное изображение со всеми уже установленными и построенными зависимостями. Таким образом, я не могу ADD /src /source/src до после установки зависимостей, поскольку это приведет к аннулированию кэшированного изображения при изменении моего собственного кода.

+0

Это интересное требование! Вы пытались взломать свой путь, предоставив «поддельный» 'lib.rs', который просто перечисляет« extern crate »? Вероятно, это создало бы репозиторий 'target', но вы всегда можете удалить его после выполнения« сборки груза ». –

+0

Это интересная идея! ;) Попробуй, когда я вернусь домой. Я совершенно не знаком с Rust, поэтому я не знаю много о внутренней работе или о том, что требуется для правильного построения - проб и ошибок был мой подход до сих пор ... –

+0

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

ответ

1

Нет никакой находчивой поддержки для построения только зависимостей в Cargo, насколько я знаю. Существует an open issue for it. Я бы не удивился, если бы вы могли что-то передать Каргу, чтобы выполнить его, или, возможно, создать сторонний грузовой аддон. Я хотел эту функциональность для cargo doc, когда мой собственный код слишком сломан для компиляции ;-)

Однако Rust playground, который я поддерживаю, выполняет конечную цель. Там есть base Docker container, который устанавливает Rustup и копирует в Cargo.toml со всеми ящиками, доступными для игровой площадки. The build steps create a blank project (with a dummy src/lib.rs), then calls cargo build and cargo build --release to compile the crates:

RUN cd/&& \ 
    cargo new playground 
WORKDIR /playground 

ADD Cargo.toml /playground/Cargo.toml 
RUN cargo build 
RUN cargo build --release 
RUN rm src/*.rs 

Позже, реальные исходные файлы копируются в контейнер и cargo build/cargo run может быть выполнена повторно, используя теперь скомпилированные ящики.

Если вы строили исполняемый проект, вы хотите скопировать и в Cargo.lock.