Conda и conda-forge для установки команд, доступных во всех средах conda - PullRequest
4 голосов
/ 12 апреля 2019

Я бы хотел установить программы с conda в одной конкретной среде conda и иметь возможность использовать связанные команды из всех сред conda.

Моя цель - разрешить учащимся установить Mercurial (плюс несколько Mercurialрасширения и связанные утилиты, такие как Meld и TortoiseHg) на любых платформах (особенно Windows) с помощью одной простой команды (или нескольких простых команд) и, конечно, без компиляции.

Конечно, * 1007Команда * должна быть доступна в терминале из любых сред 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, чтобызнаю, будет ли что-то подобное работать).Оба решения не просты, и команды не зависят от платформы.

Я не нашел команду, чтобы сделать что-то подобное в conda, но иногда эксперты по conda способны делать впечатляющие вещи!Что бы было элегантным решением этой проблемы?

Было бы также неплохо создать иконки где-нибудь (в программе запуска Anaconda?) Для графических приложений (Meld и TortoiseHg).Возможно ли это?

Редактировать: приложения Conda

Я обнаружил, что в файле meta.yaml есть способ указать, что пакет является приложением: https://docs.conda.io/projects/conda-build/en/latest/resources/define-metadata.html#app-section

Это может помочь решить проблему.

Редактировать после первого ответа на основе функции 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 ]

0 голосов
/ 02 мая 2019

Решение https://stackoverflow.com/a/55900964/1779806 содержит ошибки для сценариев, использующих command hg ..., и слишком неэффективно для этого случая (установка приложения из командной строки).См. https://github.com/conda/conda/issues/8556#issuecomment-488703716

Я создал крошечное 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.

0 голосов
/ 29 апреля 2019

Всегда можно создать функцию / псевдоним оболочки и поместить ее в файл конфигурации среды выполнения их оболочки.Например, для вашего случая использования я бы добавил следующее в мой ~/.bashrc:

hg() {
   (conda activate py27_mercurial
    command hg "$@"
    _hg_exit_code=$?
    conda deactivate
    exit $_hg_exit_code)
}

Затем, независимо от того, в какой среде вы находитесь, вы всегда запускаете hg из среды, в которой он был установлен.Чтобы убедиться, что эта функция загружена для вашей оболочки в новом сеансе, всегда можно посмотреть на вывод: type -a hg

Я делаю эту единовременную настройку для всех инструментов (некоторые скомпилированы) и имеют функцию псевдонима / оболочки для каждого.Таким образом, я могу счастливо переключаться между черно-белыми средами без особого беспокойства.

...