Как добавить внешние пакеты и запустить в компиляторе ржавчины? - PullRequest
3 голосов
/ 26 января 2020

Я компилирую и собираю пример программы с использованием ржавчины. Я выбрал rustc вместо cargo для компиляции, потому что это простой личный тестовый проект. До сих пор использование rustc для компиляции и сборки исполняемого файла работало нормально, но когда я попытался добавить внешний пакет rand, он выдает мне эту ошибку

1 | extern crate rand;
  | ^^^^^^^^^^^^^^^^^^ can't find crate

Это полный код

extern crate rand;

use rand::Rng;

fn main() {
    for x in 1..11 {
        let random_number = rand::thread_rng()
            .gen_range(1, 101);
        println!("{} -> {}", x, random_number)
    }
}

Как добавить внешние пакеты и запустить с rustc?

Ответы [ 2 ]

6 голосов
/ 26 января 2020

Это возможно без Car go, но вам придется делать то, что он обычно делает для вас.

  1. Скачать все зависимости.
  2. Скомпилировать все зависимости с rustc с использованием правильных флагов.
rand v0.7.3
├── getrandom v0.1.14
│   ├── cfg-if v0.1.10
│   └── libc v0.2.66
├── libc v0.2.66 (*)
├── rand_chacha v0.2.1
│   ├── c2-chacha v0.2.3
│   │   └── ppv-lite86 v0.2.6
│   └── rand_core v0.5.1
│       └── getrandom v0.1.14 (*)
└── rand_core v0.5.1 (*)

rand не так уж и плохо, всего 8 транзитивных зависимостей (включая сам rand, не включая дубликаты). Тем не менее, вам нужно go к crates.io или github и загрузить правильную версию исходного кода для каждого.

Затем идет компиляция. Минимум, который вам нужно будет сделать, чтобы скомпилировать свой двоичный файл, составляет rustc -L dependency=/path/to/dependency/dir src/main.rs. Но помните, что вы должны сделать это для каждой из 8 зависимостей, и все они имеют свои внешние зависимости. Вам также необходимо определить правильный порядок их компиляции.

Перемещение, некоторые ящики имеют свои собственные настройки в Cargo.toml, которые необходимо соблюдать. Некоторые ящики даже имеют скрипт сборки, который нужно скомпилировать и запустить (libc - пример в этом дереве зависимостей).


В качестве альтернативы, вы можете просто поставить

[dependencies]
rand = "0.7.3"

в вашем Cargo.toml и запустите cargo build. Твой выбор. Car go - это одна из самых приятных вещей в Rust, поэтому я предлагаю вам его использовать.


PS Чтобы увидеть, что именно cargo делает, запустите cargo clean, чтобы удалить все уже скомпилированные зависимости , Затем запустите cargo build --verbose (или cargo build -vv, если вы смелый). Вы увидите все флаги, которые передаются rustc, скрипты, которые запускаются, и все остальное.

2 голосов
/ 27 января 2020

Я хотел бы расширить ответ @ SCappella. Я бы посоветовал вам использовать cargo. Если вы знакомы с менеджерами пакетов на других языках, таких как JS, PHP или Python, возможно, вас заинтересует car go edit .

Это позволяет выполнять команды cargo add rand (последняя версия), cargo add rand@0.7.3 (указать c версия), cargo upgrade rand (только обновление rand), cargo upgrade (обновить все зависимости) в CLI вместо редактирования Cargo.toml файл.

Чтобы установить его, запустите cargo install cargo-edit, а затем прочитайте документацию на веб-сайте о том, как его использовать.

...