2016-08-12 1 views
3

Я пытаюсь реорганизовать мое управление версиями пакета python, поэтому мне нужно только обновить версию в одном месте, предпочтительно в модуле python или текстовом файле. Для всех мест, в которых мне нужна моя версия, кажется, есть способ загрузить ее из источника from mypkg import __version__ или хотя бы разобрать ее из файла в виде текста. Кажется, я не могу найти способ сделать это с помощью моего файла meta.yaml. Есть ли способ загрузить версию из внешнего источника в файл meta.yaml?Получить версию пакета для conda meta.yaml из исходного файла

Я знаю, что существуют переменные окружения git, но я не хочу отмечать каждую транзакцию альфа/бета/rc, которая тестируется через локальный репозиторий conda. Я мог загрузить объект python с помощью !!python/object в pyyaml, но conda не поддерживает произвольное выполнение python. Я не вижу способа сделать это с любыми другими функциями jinja2. Я мог бы написать сценарий для обновления номера версии более чем в одном месте, но я действительно надеялся только изменить один файл как окончательный номер версии. Спасибо за любую помощь.

+0

FYI для тех, кто подходит к этому, прежде чем она получает лучший ответ: я остановился на GIT теги * и * я добавил специальную команду для моего setup.py для натыкаясь версии в некоторых упаковочных инструментов I» m с помощью (Inno Setup для Windows), my 'version.py' и выполнения коммитов git и тегов. – daveydave400

ответ

1

Существует множество способов добраться до конечной точки. Вот что делает сама конда ...

Источником истины для информации о версии конды является __version__ в conda/__init__.py. Он может быть загружен программно в коде python как from conda import __version__, как вы предлагаете. Он также жестко связан с setup.pyhere (примечание this code), поэтому из командной строки python setup.py --version - канонический способ получить эту информацию.

В 1.x версии Конда-сборки, поставив линию

$PYTHON setup.py --version > __conda_version__.txt 

в build.sh бы установить версию для встроенного пакета, используя наш источник истины. Файл __conda_version__.txt устарел, однако он, скорее всего, будет удален с выпуском conda-build 2.0. В последних версиях conda-build предпочтительный способ сделать это - использовать load_setup_py_data() в контексте jinja2, что даст вам доступ ко всем метаданным от setup.py. В частности, в файле meta.yaml, мы бы что-то вроде этого

package: 
    name: conda 
    version: "{{ load_setup_py_data().version }}" 

Теперь, как переменная __version__ устанавливается в conda/__init__.py ...

Что вы see in the source code призыв к auxlib.packaging.get_version() функция. Эта функция выполняет следующие функции в порядке

  1. посмотреть первый для файла conda/.version, и если найден возвращает содержимое в качестве идентификатора версии
  2. выглядеть следующим для переменного в VERSION среды, и если установить возвращает значение в качестве версии идентификатор
  3. выглядит последним на git describe --tags выходе, и, если это возможно возвращать идентификатор версии (должна быть установлен мерзавец, должен быть GIT репозиторий, и т.д. и т.п.)
  4. , если ни один из вышеперечисленного выхода идентификатор версии, не возвращает None

Теперь есть еще один заключительный трюк. Вот conda мы установили cmdclass для build_py и sdist в соответствии с условиями, указанными в auxlib.packaging.В основном мы имеем

from auxlib import packaging 
setup(
    cmdclass={ 
     'build_py': packaging.BuildPyCommand, 
     'sdist': packaging.SDistCommand, 
    } 
) 

Эти специальные классы команд на самом деле изменить conda/__init__.py файл в построенных/установленных пакетов так что переменная __version__ жестко закодировано в строковый литерал, и не использует функцию auxlib.packaging.get_version().


В вашем случае, с не желая, чтобы пометить каждый релиз, вы можете использовать все выше, и из командной строки, установите версию с помощью переменной в VERSION среды. Что-то вроде

VERSION=1.0.0alpha1 conda build conda.recipe 

В вашем build разделе meta.yaml рецепта, вам нужно добавить script_env ключ, чтобы сказать Конда-билд, чтобы передать переменную VERSION среды вплоть до среды сборки.

build: 
    script_env: 
    - VERSION 
+0

Я бы добавил, что есть примеры этого в https://github.com/conda/conda-build/tree/master/tests/test-recipes/metadata/source_setup_py_data и что это работает с любым способом установки версии в setup.py - versioneer, setuptools-scm или что-то еще. Также обратите внимание, что load_setup_py_data называлось load_setuptools. Это изменилось в 1.21.12. Оба имени действительны прямо сейчас, но load_setuptools выдаст предупреждающее сообщение об устаревании. – msarahan

+0

Awesome. Судя по PR для 'load_setup_py_data', похоже, что это было недоступно (по крайней мере, так, как оно указано сейчас) очень долго. Спасибо за помощь, я попробую это сегодня. ... но в то время как я обращаю ваше внимание, должен сообщать об ошибках (seg faults и т. д.) для пакетов из anaconda в 'conda/conda' или' ContinuumIO/anaconda-recipes'? – daveydave400

+0

Сообщения об ошибках для пакетов обычно должны обращаться к проблемам ContinuumIO/anaconda. Если у вас есть конкретные улучшения в рецепте, пожалуйста, напишите PR или вопрос о ContinuumIO/anaconda-recipes. conda/conda специально для проблем с conda, инструментом управления пакетами. – msarahan