Можем ли мы что-то загрузить и установить переменную среды во время установки ящика?

Как разработчик ящика с драйверами Rust, я хотел бы выполнить следующие шаги во время установки/загрузки ящика при использовании любой другой программы Rust:

  1. Проверьте платформу, т. е. Windows, UNIX или macOS.
  2. Загрузите соответствующий двоичный файл для конкретной платформы с внешнего веб-сайта.
  3. Установите переменную среды, указывающую на место загрузки.

Я знаю, что это возможно в Node, Python или R, но не уверен, что это возможно в Rust.


person BINIT KUMAR    schedule 15.12.2020    source источник
comment
cargo install ожидает сборки вашего ящика и не должен загружать бинарные файлы. И если вы не хотите зависеть от cargo или заставлять своих пользователей устанавливать набор инструментов Rust, используйте любую систему установки/упаковки, которую предпочитает ваша целевая платформа.   -  person mcarton    schedule 15.12.2020


Ответы (1)


Для этого вы можете использовать скрипт сборки (но это не то, что вы должны делать, см. примечание ниже).

Скрипт будет скомпилирован и выполнен до того, как груз начнет собирать вашу библиотеку.

  1. Внутри скрипта вы можете использовать атрибут cfg для проверки Платформа.
  2. Есть куча библиотек для скачивания чего-либо по HTTP, например reqwest
  3. Вы можете установить переменную среды через cargo:rustc-env= ПЕРЕМЕННАЯ=ЗНАЧЕНИЕ

ВАЖНОЕ ПРИМЕЧАНИЕ

Большинство пользователей Rust не ожидают такого поведения от скрипта сборки. Проблем с подходом может быть с десяток. Вот лишь некоторые из них, которые пришли мне в голову:

  • Во-первых, могут быть проблемы с безопасностью.
  • Подход сломает сборки на стороне клиента.

Я считаю, что лучше загружать все двоичные файлы, которые вам нужны, как часть ящика. Для этого вы можете использовать include_bytes!.

person MaxV    schedule 15.12.2020
comment
Сценарий сборки не должен загружать предварительно скомпилированные двоичные файлы для конкретной цели! И шаг 3 работает только во время сборки, что не похоже на то, чего хочет ОП. - person mcarton; 15.12.2020
comment
Привет @макартон. Спасибо за ваш комментарий. step 3 only works during the build, which doesn't seem to be what the OP wants. - трудно сказать, но если OP хочет передать значение переменной в источниках, это можно сделать, предоставив переменную для фазы сборки, а затем используя ее через env!. - person MaxV; 15.12.2020
comment
По поводу A build script should not be downloading precompiled target-specific binaries!. Я согласен с вами, это будет плохой поступок. Но я не уверен, есть ли какой-либо механизм, который предотвращает это. Не могли бы вы помочь мне улучшить внешний вид моей заметки There is a couple of problems? Кажется, include_bytes! должно работать на ОП. - person MaxV; 15.12.2020
comment
Если вы хотите добавить -1, пожалуйста, оставьте краткий комментарий, чтобы помочь мне улучшить мой ответ. Я знаю, что такое поведение не ожидается. Я знаю, что скрипты сборки были созданы для решения разных проблем. Но, похоже, решение должно работать. Если мы, как сообщество Rust, недовольны этой возможностью, мы должны ввести что-то, чтобы этого не произошло. Я не верю, что сохранение этого в секрете улучшит ситуацию. - person MaxV; 15.12.2020
comment
Я согласен с Джоном и, следовательно, пытался написать отдельный файл ржавчины, чтобы сделать то же самое. Но в настоящее время я застрял в части загрузки, где я использую этот пример ссылки rust-lang-nursery.github.io/rust-cookbook/web/clients/, но, похоже, он не работает и действительно сложен, побуждая к использованию асинхронности и всего остального. Есть ли другой простой способ загрузить файл с помощью RUST? т. е. я хочу загрузить двоичный файл с URL-адреса и сохранить в локальном каталоге. - person BINIT KUMAR; 16.12.2020