如何让 Travis CI 与 Rust 0.12.0 和 Cargo 一起工作?

How to make Travis CI work with Rust 0.12.0 and Cargo?

我正在尝试让 Travis CI 构建和测试我的 GitHub 存储库的内容,它与 Rust 0.12.0 和旧的 Cargo 兼容:

rustc 0.12.0 (ba4081a5a 2014-10-07 13:44:41 -0700)
cargo 0.0.1-pre-nightly (861c07f 2014-10-07 23:29:57 +0000)

我在 .travis.yml:

中指定了 Rust 0.12.0
language: rust
rust: 0.12.0
script:
  - cargo build --verbose
  - cargo test --verbose
  - rustdoc --test README.md -L target
  - cargo doc

我似乎遇到的问题是 Travis 每晚都会挑选最新的 Cargo: cargo 0.0.1-pre-nightly (fd5d7a9 2014-12-25 04:28:40 +0000)

但是这个较新的版本与 Rust 0.12.0 不兼容,因为它现在使用 --emit=dep-info 而它曾经使用 --dep-info:

--dep-info [FILENAME]
                    Output dependency info to <filename> after compiling,
                    in a format suitable for use by Makefiles

这会导致 rustc 调用错误,因为 --emit 的值无效:

Running `rustc src/sqlite3.rs --crate-name sqlite3 --crate-type lib -g -C metadata=1c7080eec8c6f90d -C extra-filename=-1c7080eec8c6f90d --out-dir target/deps --emit=dep-info,link -L target/deps -L target/deps -Awarnings`
...
error: unknown emission type: `dep-info`
...
Could not compile `sqlite3`.

我一直在寻找其他存储库来解决这个问题,但似乎他们要么没有将 Cargo 与 0.12.0(与 Travis 一起使用)一起使用,要么遇到了同样的问题,如下所示:https://travis-ci.org/eliovir/rust-ini

我找不到任何适用于 Travis、rust 0.12.0 和 Cargo 的存储库。如果我可以在某处指定 Cargo 的版本,我将能够解决这个问题,但我未能在 .travis.yml 文件中找到这样做的方法。

当然,随着 Rust 1.0 的到来,如果没有我忽略的明显解决方案,我将等待它:-)

我同意每晚跟踪可能是最好的选择。如果您依赖的依赖项没有被更新,那么也许这表明它们也不会在 1.0 版本中更新!

综上所述,Travis 确实允许您在构建之前安装一些东西。这是完全未经测试的,但你可以做类似

的事情
before_script:
  - wget https://static.rust-lang.org/dist/rust-0.12.0-x86_64-unknown-linux-gnu.tar.gz
  - tar -xvf rust-0.12.0-x86_64-unknown-linux-gnu.tar.gz
  - ./rust-0.12.0-x86_64-unknown-linux-gnu/install.sh --prefix /tmp/rust-0.12/
  - export PATH=$PATH:$PWD/tmp/rust-0.12/bin
  - export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD/tmp/rust-0.12/lib

这将下载 Rust 0.12,解压并将其安装在可写的地方(在哪里并不重要)。然后你设置环境变量来指出 Rust 的位置。执行相同操作以下载 Cargo 的兼容版本。

如果 Travis 有 "bare" 语言包,那将是最好的。否则你可以尝试使用 Rust buildpack,或者其他任何东西(以避免处理多个 rustc 版本)。