Conda и conda-forge для установки команд, доступных во всех средах conda
Я хотел бы установить программы с conda в одной конкретной среде conda и иметь возможность использовать связанные команды из всех сред conda.
Моя цель - позволить студентам устанавливать Mercurial (плюс несколько расширений Mercurial и связанные с ними утилиты, такие как Meld и TortoiseHg) на любые платформы (особенно Windows) с помощью одной простой команды (или нескольких простых команд) и, конечно, без компиляции.
Конечно hg
Команда должна быть доступна в терминале из любых сред conda (приглашение anaconda в Windows). Пакеты Mercurial не могут быть установлены в базовой среде, потому что Mercurial все еще работает лучше в Python 2.7 (в любом случае, он не будет чистым).
Теперь Mercurial и необходимые нам расширения могут быть установлены на всех платформах примерно так:
conda create -n py27_mercurial -c conda-forge python=2.7 mercurial dulwich ipaddress
conda activate py27_mercurial
pip install hg-evolve hg-git
Немного поработав с conda-forge и метапакетом conda, это не составит труда сделать с помощью одной очень простой команды. Более того, не должно быть трудностей в создании пакетов conda для Meld и TortoiseHg.
На этом этапе hg
Команда доступна, когда среда активирована (и очень просто установить другие расширения Mercurial). Чтобы сделать его доступным из другой среды (и в базовой среде), необходимо добавить путь к каталогу, содержащему hg
на переменную окружения PATH или на Unix для создания символической ссылки (я не знаю Windows достаточно, чтобы знать, будет ли работать что-то подобное). Оба решения не просты, и команды не зависят от платформы.
Я не нашел команды сделать что-то подобное в Конде, но иногда эксперты Конды могут делать впечатляющие вещи! Что бы было элегантным решением этой проблемы?
Также было бы неплохо создать иконки где-нибудь (в программе запуска Anaconda?) Для графических приложений (Meld и TortoiseHg). Является ли это возможным?
Изменить: приложения Конда
Я обнаружил, что в файле meta.yaml есть способ указать, что пакет является приложением: https://docs.conda.io/projects/conda-build/en/latest/resources/define-metadata.html
Это может помочь решить проблему.
Редактировать после первого ответа на основе функции bash:
Конечно, я ищу решение, включающее очень небольшую работу (и понимание) для пользователей и с кроссплатформенными командами.
Обратите внимание, что для Linux и Bash можно просто сделать:
CONDA_APP_DIR=$HOME/.local/bin/bin-conda-app/
mkdir -p $CONDA_APP_DIR
echo -e "\nexport PATH=\$PATH:$CONDA_APP_DIR\n" >> ~/.bashrc
ln -s $(which hg) $CONDA_APP_DIR/hg
Нет необходимости каждый раз активировать / деактивировать среду hg
используется...
Конечно, такие решения, зависящие от системы и оболочки, не являются удовлетворительными. Должно быть возможно делать такие вещи с помощью кроссплатформенных команд типа conda (см. https://github.com/conda/conda/issues/8556), что-то вроде
conda config --add channels conda-forge
conda install conda-app
conda-app install mercurial
Теперь я просто должен реализовать conda-app
2 ответа
Решение /questions/48926730/conda-i-conda-forge-dlya-ustanovki-komand-dostupnyih-vo-vseh-sredah-conda/48926746#48926746 содержит ошибки для сценариев, использующих command hg ...
и слишком неэффективно для этого случая (установка приложения из командной строки). См. https://github.com/conda/conda/issues/8556.
Я создал крошечное conda-приложение на Python ( https://pypi.org/project/conda-app/), чтобы улучшить эту ситуацию.
Теперь это должно работать в системах Unix (с Bash и Fish):
conda activate base
conda config --add channels conda-forge
pip install conda-app
conda-app install mercurial
Не должно быть трудно улучшить conda-app
также поддерживать Windows.
В настоящее время пользователи Windows могут установить Mercurial и важные расширения, установив TortoiseHG.
Всегда можно создать функцию / псевдоним оболочки и запихнуть ее в конфигурационный файл своей оболочки. Например, для вашего случая использования, я бы добавил следующее в моем ~/.bashrc
:
hg() {
(conda activate py27_mercurial
command hg "$@"
_hg_exit_code=$?
conda deactivate
exit $_hg_exit_code)
}
Затем, независимо от того, в какой среде вы находитесь, вы всегда запускаете hg из среды, в которой он был установлен. Чтобы убедиться, что эта функция загружена для вашей оболочки в новом сеансе, всегда можно посмотреть на вывод для: type -a hg
Я делаю эту однократную настройку для всех инструментов (некоторые скомпилированы на заказ) и для каждого из них предусмотрена функция псевдонима / оболочки. Таким образом, я могу счастливо переключаться между черно-белыми средами без особого беспокойства.