#continuous-integration #conda #conda-build #conda-forge
#непрерывная интеграция #conda #conda-build #conda-forge
Вопрос:
Я хотел бы распространять несколько версий пакета через conda. В частности, я хотел бы сделать что-то вроде этого:
...
package-v1.2-dev
package-v1.2
package-v1.1-dev
package-v1.1
package-v1.0
Хитрость в том, что я хотел бы, чтобы «последним» или пакетом по умолчанию были версии выпуска, которых нет -dev
. Как я понимаю, conda install <package>
без номера версии будет установлена новейшая сборка. В моем случае так будет всегда -dev
. Возможно ли установить по умолчанию определенный номер версии?
Ответ №1:
Вы можете добиться этого, указав пользовательскую «метку» для своих dev
пакетов. Продолжайте использовать main
метку по умолчанию для своих пакетов выпуска, но используйте неосновную метку (например dev
) для других пакетов.
Во-первых, краткое замечание о номерах версий: версии пакета conda не должны содержать -
символ, поэтому v1.2-dev
это недопустимая версия. Для следующих примеров я буду использовать v1.2.dev
.
Вот как загрузить ваши пакеты:
anaconda upload mypackage-v1.2.tar.bz2
anaconda upload --labels dev mypackage-v1.2.dev.tar.bz2
(Вы также можете изменять метки для существующих пакетов через свою учетную запись на http://anaconda.org веб—сайт.)
По умолчанию ваши пользователи будут загружать только ваши основные пакеты. У пользователей, которым нужны dev
пакеты, будет два варианта:
- Они могут указать
dev
метку в командной строке:conda install -c mychannel/label/dev mypackage
или
- Они могут добавить ваш
dev
ярлык в свою.condarc
конфигурацию# .condarc channels: - mychannel/label/dev # dev label - mychannel # main label only - conda-forge - defaults
И тогда нет необходимости указывать канал в командной строке:
conda install mypackage
PS — Вот дополнительная заметка о том, что вы написали выше:
Как я понимаю,
conda install <package>
без номера версии будет установлена новейшая сборка
Просто чтобы уточнить, он устанавливает не «новейшую» в хронологическом смысле, а самую высокую совместимую версию в соответствии с логикой conda VersionOrder
. Эта логика разработана так, чтобы быть в значительной степени совместимой с соответствующими соглашениями Python (например, PEP440 и другими), но с некоторыми возможностями для совместимости с соглашениями других языков.
Пожалуйста, обратите внимание: что касается conda (и PEP440), 1.2.dev
то она ПРЕДШЕСТВУЕТ 1.2
. (Возможно, вы это уже знали, но я не считаю это очевидным.)
$ python
>>> from conda.models.version import VersionOrder
>>> VersionOrder('1.2.dev') < VersionOrder('1.2')
True
Комментарии:
1. Спасибо за дополнительную информацию о заказе версий. По-видимому, я неправильно определял версии своих проектов! Я считаю
v1.2.dev
, что это ветвь разработчика послеv1.2
того, как она помечена и выпущена. Похоже, что соглашение Python заключается в том, чтоv1.2.dev
послеv1.1
выпуска и находитсяv1.2
в разработке.2. Да, это определенно не очевидно, ИМХО. Я удивился, когда впервые увидел это. PEP440 присваивает специальные значения некоторым идентификаторам :
[N!]N(.N)*[{a|b|rc}N][.postN][.devN]
3. К вашему сведению, для интеграции с Conda-forge: conda-forge.org/docs/maintainer /…
4. Ах, я не знал об этой функции. Спасибо!