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

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

Другие вопросы по тегам