Публикация пакетов Python, связанных с биоинформатикой, на Bioconda

Были ли у вас проблемы с установкой пакетов и запуском огромного количества команд для установки зависимостей? Если вам повезет (в большинстве случаев вам не повезет), вы в конечном итоге установите пакет без каких-либо проблем с зависимостями или конфликтов версий. Работая в междисциплинарных науках, я понял, как сложно заставить эти инструменты работать, если вы не знаете, что на самом деле происходит с точки зрения программирования. Вы хотите, чтобы эти инструменты поставлялись в комплекте со всеми зависимостями и могли быть установлены/запущены без конфликтов с тем, что вы уже установили.

Не бойтесь — мои дорогие читатели! Пакетные менеджеры придут на помощь! Это программные инструменты, такие как conda и pip, которые последовательно автоматизируют процесс установки, обслуживания и удаления программ. Наличие вашего пакета в таком репозитории может помочь вашим пользователям установить его без особых хлопот. Это также увеличивает видимость и охват вашего пакета. В этой статье я расскажу вам, как опубликовать пакет Python, связанный с биоинформатикой, на bioconda, с примерами фрагментов кода, шаблонами и рекомендациями.

Биоконда и рецепты

Мое сообщество (включая меня 😃) любит биоконду! Bioconda позволяет устанавливать пакеты, связанные с биомедицинскими исследованиями, с помощью менеджера пакетов conda. Bioconda — это, по сути, канал (место, где хранятся пакеты), в котором есть рецепты, содержащие метаданные опубликованных программных пакетов. Мы должны создать аналогичный рецепт и добавить его в канал биоконды. Предполагая, что у вас есть учетная запись GitHub и вы установили Miniconda или Anaconda, давайте начнем.

Шаг 1. Настройте репозиторий рецептов биоконды.

Если вы впервые публикуете на bioconda, вам необходимо настроить свою копию репозитория bioconda-recipes.



Нажмите здесь, чтобы создать ответвление репозитория рецептов биоконды.

Теперь создайте локальный клон репозитория, используя следующую команду. Обязательно замените <USERNAME> своим именем пользователя GitHub.

git clone https://github.com/<USERNAME>/bioconda-recipes.git

Затем добавьте основной репозиторий bioconda-recipes в качестве вышестоящего удаленного сервера, чтобы упростить обновление внесенных изменений.

cd bioconda-recipes
git remote add upstream https://github.com/bioconda/bioconda-recipes.git

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

git checkout master
git pull upstream master
git push origin master

Вы можете зайти в свой репозиторий GitHub и проверить, обновлен ли ваш форк по сравнению с исходным репозиторием.

Шаг 2: Создайте ветку

Рекомендуется создать собственную ветку для работы. Предполагая, что имя вашего инструмента mytool, давайте создадим ветку, используя следующую команду. Не стесняйтесь заменять mytool названием вашего инструмента.

git checkout -b mytool

Шаг 3: Создайте свой рецепт

Рецепт будет содержать файл meta.yaml со всеми метаданными рецепта. Обычно этого файла должно быть достаточно для чистого пакета Python. Если вам нужно скомпилировать дополнительные пакеты (например, пакеты C/C++) или экспортировать пути, их следует добавить в файл build.sh для macOS и Linux или в файл bld.bat для Windows.

Начнем с перехода в каталог рецептов.

cd recipes

Создайте рецепт, используя conda skeleton

Если у вас уже есть пакет в индексе пакетов Python (PyPI), вы можете использовать команду conda skeleton следующим образом для автоматического создания шаблона. Следующая команда создаст папку с именем mytool с файлом meta.yaml внутри.

conda skeleton pypi mytool

Создайте свой собственный рецепт

Если ваш код должен быть загружен из имеющегося у вас репозитория GitHub и скомпилирован, вам следует опубликовать выпуск на GitHub. Вот шаблон, предполагающий, что ваш пакет соответствует базовой структуре пакета Python. Обязательно измените <USERNAME>, mytool и номер версии, чтобы они соответствовали вашей учетной записи GitHub и сведениям о пакете.

{% set name = "mytool" %}
{% set version = "0.1.0" %}

package:
  name: "{{ name|lower }}"
  version: "{{ version }}"

source:
  url: "https://github.com/<USERNAME>/{{ name }}/archive/v{{ version }}.tar.gz"
  sha256: 8e87ae23bd81b842b95d778291d9379b2d89936c14dbb8216ac9cb2d7104c87a

build:
  number: 0
  noarch: python
  entry_points:
    - myutil=mytool_utils.myutil:main
  script:
    - {{ PYTHON }} -m pip install . --no-deps -vv

requirements:
  build:
    - {{ compiler('cxx') }}
  host:
    - pip
    - python >=3.8
  run:
    - python >=3.8
    - biopython
    - pysam
    - networkx
    - scipy
    - numpy
    - tqdm

test:
  commands:
    - mytool --help

about:
  home: "https://github.com/<USERNAME>/mytool"
  license: MIT
  license_file: LICENSE
  summary: "mytool: This is a test"
  doc_url: "https://mytool.readthedocs.io/"
  dev_url: "https://github.com/<USERNAME>/mytool"

extra:
  recipe-maintainers:
    - <USERNAME>
  identifiers:
    - doi:10.10943/myjournal

Начните с имени и версии вашего пакета под package.

Тогда вам следует указать на выпуск под source. Обязательно добавьте правильный URL-адрес с правильной контрольной суммой SHA256. Вы можете получить контрольную сумму SHA256 исходного кода, используя следующую команду.

name=<your_repo_name>
version=<release_version>
url=https://github.com/<USERNAME>/$name/archive/v$version.tar.gz
wget -O- $url | shasum -a 256

Под build вы должны указать номер сборки (начиная с 0), платформу и команды сборки (здесь я добавил команду сборки для setup.py). Здесь я определил noarch: python, что означает, что это чистый пакет Python noarch, который не содержит никаких файлов, специфичных для операционной системы. Если вы хотите вызывать пользовательские сценарии из командной строки, вы можете добавить их в entry-points, который будет определять команды оболочки, определяя функцию Python для запуска (в нашем примере это main).

Затем вы должны указать компиляторы, препроцессоры, версии Python и зависимости (с закрепленными конкретными версиями, если вам нужно) в разделе requirements. При закреплении версий пакетов пакеты и их версии должны быть разделены пробелом (например, python >=3.8).

Далее можно указать команду для проверки установки под commands в tests. Обычно я вызываю справочную команду своего инструмента. Следите за тем, чтобы эти тестовые команды были быстрыми и простыми.

Затем вы можете добавить сведения о пакете, такие как URL-адрес домашней страницы, URL-адрес документации, тип лицензии, файл лицензии и сводку инструмента в разделе about.

Наконец, вы можете добавить свое имя пользователя GitHub inrecipe-maintainers и DOI публикации inidentifiers под extra.

Если вы хотите узнать больше о разделах в файле meta.yaml, ознакомьтесь с официальной документацией по биоконде.



Совет: посмотрите чужие рецепты.

Если вы понятия не имеете, как создать рецепт, посмотрите другие рецепты, например код, который вы можете использовать, и скопируйте его в свой собственный каталог рецептов. Вот несколько замечательных рецептов для примера.

Вы можете проверить свои изменения, используя следующую команду.

git status

Шаг 4: Зафиксируйте и отправьте изменения

Вы можете зафиксировать свои изменения и отправить их из ветки mytool в разветвленный репозиторий GitHub.

git add mytool
git commit -m 'Add mytool v0.1.0'
git push --set-upstream origin mytool

Шаг 5: Создайте запрос на включение

Теперь перейдите в свой разветвленный репозиторий GitHub, и вы увидите сообщение о том, что This branch is 1 commit ahead [...] bioconda:master. Вы увидите кнопку Pull Request, нажмите на нее и следуйте инструкциям. Вы должны добавить описание вашего запроса на извлечение. Вот pull request, который я создал, чтобы добавить один из моих инструментов. Если у вашего пакета есть публикация, обязательно добавьте и эти данные.

Как только вы создадите запрос на вытягивание, система сборки bioconda начнет тестировать ваши изменения. Если вам очень повезет, у вас не будет никаких проблем, и ваша сборка пройдет. Если нет, отредактируйте свой рецепт, чтобы исправить проблемы, и снова отправьте изменения в свою ветку (и снова, и снова).

Когда ваша сборка «позеленеет» и все проверки пройдены, вы можете выполнить команду @BiocondaBot please add label.

Шаг 6: протестируйте сборку

Тем временем вы можете ввести команду @BiocondaBot please fetch artifacts, чтобы получить ссылки на пакеты/контейнеры, созданные CI. Вы можете загрузить эти сборки и использовать их для локального тестирования пакетов. После загрузки сборки создайте новую среду conda (НЕ устанавливайте в среде base) и просто выполните следующую команду, чтобы установить пакет. Обязательно замените <build_file_name> именем загруженного файла .tar.bz2.

conda install -c packages <build_file_name>

Теперь вы можете протестировать свою установку, используя следующие команды.

# show the location of the executable
which mytool

# print the version
mytool --version

# print the help message
mytool --help

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

Если все пойдет хорошо, кто-то из команды bioconda одобрит ваш запрос на включение, и изменения будут объединены в основной репозиторий.

Последние мысли

Bioconda поддерживает зависимости только от каналов defaults, conda-forge и bioconda. Так что, если у вас есть зависимости от каких-либо других каналов, их нельзя указать в файле meta.yaml и ваш рецепт не соберется (все еще есть открытые проблемы). В этом случае вам придется опубликовать свой пакет на собственном канале, о чем мы поговорим в следующей статье.

Надеюсь, вы нашли эту статью полезной для публикации своего собственного программного обеспечения для биоинформатики на bioconda. Не стесняйтесь просматривать руководства по биоконде для получения более подробной информации.

Удачной публикации пакета!

Ваше здоровье!

Рекомендации

[1] Начальная настройка — документация Bioconda доступна по адресу https://bioconda.github.io/contributor/setup.html.

[2] Рабочий процесс участия — документация Bioconda доступна по адресу https://bioconda.github.io/contributor/workflow.html.

[3] Учебные пособия — документация Bioconda доступна по адресу https://bioconda.github.io/tutorials/index.html.

[4] Опыт моей личной икоты при публикации моих пакетов 😁