我正在尝试使用Cargo在我的系统(Arch Linux)上安装Rust crate.我可以搜索板条箱并找到我需要的东西,例如:
$ cargo search curl | head -n3
Updating registry `https://github.com/rust-lang/crates.io-index`
curl (0.3.0) Rust bindings to libcurl for making HTTP requests
curl-sys (0.2.0) Native bindings to the libcurl library
Run Code Online (Sandbox Code Playgroud)
当我尝试安装它时,我收到以下错误:
$ cargo install curl
Updating registry `https://github.com/rust-lang/crates.io-index`
error: specified package has no binaries
Run Code Online (Sandbox Code Playgroud)
这是什么意思?我是否必须先从源代码构建它?如果Cargo没有安装它,它有什么意义?
$ uname -a
Linux 4.6.1-2-ARCH #1 SMP PREEMPT Thu Jun 2 15:46:17 CEST 2016 x86_64 GNU/Linux
$ rustc --version
rustc 1.9.0
$ cargo --version
cargo 0.10.0 (10ddd7d 2016-04-08)
Run Code Online (Sandbox Code Playgroud) 有没有办法告诉Cargo安装和构建我的所有依赖项,但是没有尝试构建我的应用程序?
我想cargo install会这样做,但它实际上也一直在构建我的应用程序.我想进入一个状态,在那里cargo build可以找到所有依赖项,但无需触及/src目录.
我真正想要实现的目标:
我正在尝试为Rust应用程序构建Docker镜像,我想在其中执行以下步骤:
建立时间(docker build .):
运行时间(docker run ...):
我已经尝试了以下内容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
Run Code Online (Sandbox Code Playgroud)
我想将安装依赖项步骤与实际构建我的应用程序分开的原因是,如果我不更改依赖项,我希望Docker能够使用已安装和构建所有依赖项的缓存映像.因此,我不能ADD /src /source/src,直到后安装依赖条件,因为当我改变我自己的代码,将无效缓存图像.
Cargo 具有--target-dir指定存储临时或缓存构建工件的目录的标志。您还可以在文件中在用户范围内设置它~/.cargo/config。我想将其设置为单个共享目录以使维护更容易。
我看到一些工件目录在目标目录中带有一些唯一的(?)哈希值,这看起来很安全,但最终产品没有带有哈希值后缀,这对于名称冲突来说似乎并不安全。我对此不确定,因为我不是货运专家。
我尝试设置~/.cargo/config为
[build]
target-dir = "./.build"
Run Code Online (Sandbox Code Playgroud)
我的初衷是使用项目的本地./.build目录,但不知何故 Cargo 将所有构建文件放入~/.build目录中。我很好奇会发生什么,我将每个项目的所有构建文件放入一个共享构建目录中。
到目前为止,它已经在多个不同的项目中运行良好,但仅适用于几个示例并不意味着它的设计或保证适用于每种情况。
就我而言,我对用户的所有工作区的所有项目使用单个共享构建目录。不仅仅是工作区中的项目。从字面上看,是用户每个工作空间中的每个项目。据我所知,Cargo 被设计为与本地target目录一起使用。如果它被设计为仅使用本地目录,则共享构建目录可能会导致一些问题。
当使用 Cargo 构建我的 Rust 项目时,每次触发时它都会下载并编译所有 crate cargo build。
有没有办法缓存这些库并加速我的构建过程?
我在 Ubuntu 16.04 机器上运行它,并使用 Docker 来运行我的构建。我想需要一些安装目录来跨构建共享,这可以解决我的问题。