从源文件获取conda meta.yaml的包版本

djh*_*ese 7 python conda

我正在尝试重新组织我的python包版本控制,所以我只需要在一个地方更新版本,最好是python模块或文本文件.对于我需要我的版本的所有地方,似乎有一种方法从源加载它from mypkg import __version__或至少将其作为文本解析出文件.我似乎找不到使用我的conda meta.yaml文件的方法.有没有办法从meta.yaml文件中的外部源加载版本?

我知道有git环境变量,但我不想标记通过本地conda存储库测试的每个alpha/beta/rc提交.我可以使用!!python/objectpyyaml 加载python对象,但是conda不支持任意python执行.我没有看到任何其他jinja2功能的方法.我还可以编写一个脚本来更新多个版本号,但我真的希望只修改一个文件作为最终版本号.谢谢你的帮助.

sta*_*son 6

截至conda-build-3.16.1(Nov-2018),这是version在conda配方中以编程方式设置的方法。

这些例子的一部分meta.yaml,你传递给conda-build作为解释在这里

A.进入setup.py的版本:

如果您要构建python软件包,那么此食谱非常理想,因为setup.py无论如何都需要它,因此您必须已经弄清楚了。

{% set data = load_setup_py_data() %}

package:
  name: mypackage
  version: {{ data.get('version') }}
Run Code Online (Sandbox Code Playgroud)

请注意,有时您必须明确告知conda配方在哪里找到(如果它与以下目录不在同一目录中)setup.py

{% set data = load_setup_py_data(setup_file='../setup.py', from_recipe_dir=True) %}
Run Code Online (Sandbox Code Playgroud)

现在继续:

$ conda-build conda-recipe
Run Code Online (Sandbox Code Playgroud)

B. Git环境变量

如果您的项目以git标记,并且您使用的是conda接受为有效版本号的标记格式(例如2.5.1v2.5.1),则此食谱非常有用。

package:
  name: hub
  version: {{ GIT_DESCRIBE_TAG }}
Run Code Online (Sandbox Code Playgroud)

现在继续:

$ conda-build conda-recipe
Run Code Online (Sandbox Code Playgroud)

C.传递环境变量:

这对于非Python conda软件包很有用,该软件包的版本来自不同的地方,您可以完善其价值-例如将convert转换v2.5.12.5.1

package:
  name: mypkg
  version: {{ environ.get('MYPKG_VERSION', '') }}
Run Code Online (Sandbox Code Playgroud)

然后创建一个获取版本的可执行脚本,我们称之为 script-to-get-mypkg-version

现在继续加载将设置版本的env var:

$ MYPKG_VERSION=`script-to-get-mypkg-version` conda-build conda-recipe
Run Code Online (Sandbox Code Playgroud)

根据conda-build版本的不同,您可能必须使用os.environ.get代替environ.get。该文档使用后者。


这不行

请注意,如果过去曾经奏效,如2016年的答案之一所述,现在就行不通了。

package:
  name: mypkg
build:
  script_env:
    - VERSION

$ VERSION=`script-to-get-mypkg-version` conda-build conda-recipe
Run Code Online (Sandbox Code Playgroud)

conda-buildVERSION在这种情况下忽略env var 。

来源


kal*_*anz 4

有很多方法可以到达终点。这是 conda 本身所做的......

conda 版本信息的真实来源__version__位于conda/__init__.py. 它可以按照您的建议在 python 代码中以编程方式加载from conda import __version__。它也硬连接到setup.py 这里(也请注意此代码),因此从命令行python setup.py --version是获取该信息的规范方法。

在 conda-build 的 1.x 版本中,放置一行

$PYTHON setup.py --version > __conda_version__.txt
Run Code Online (Sandbox Code Playgroud)

inbuild.sh将使用我们的事实来源设置构建包的版本。 然而,该__conda_version__.txt文件已被弃用,并且可能会随着 conda-build 2.0 的发布而被删除。load_setup_py_data()在 conda-build 的最新版本中,首选方法是在 jinja2 上下文中使用,这将使您可以访问setup.py. 具体来说,在meta.yaml文件中,我们会有这样的内容

package:
  name: conda
  version: "{{ load_setup_py_data().version }}"
Run Code Online (Sandbox Code Playgroud)

现在,如何__version__设置变量conda/__init__.py......

你什么在源代码中看到的是对该函数的auxlib.packaging.get_version()调用。该函数按顺序执行以下操作

  1. 首先查找文件conda/.version,如果找到则返回内容作为版本标识符
  2. 接下来查找VERSION环境变量,如果设置则返回该值作为版本标识符
  3. 最后查看git describe --tags输出,如果可能的话返回版本标识符(必须安装 git,必须是 git 存储库,等等)
  4. 如果以上都没有产生版本标识符,则返回None

现在只剩下最后一招了。在 conda 的setup.py文件中,我们设置了cmdclassforbuild_pysdistto 提供的那些auxlib.packaging。基本上我们有

from auxlib import packaging
setup(
    cmdclass={
        'build_py': packaging.BuildPyCommand,
        'sdist': packaging.SDistCommand,
    }
)
Run Code Online (Sandbox Code Playgroud)

这些特殊的命令类实际上修改了conda/__init__.py内置/安装的包中的文件,因此__version__变量被硬编码为字符串文字,并且不使用auxlib.packaging.get_version()函数。


在您的情况下,如果不想标记每个版本,您可以使用上述所有内容,并从命令行使用VERSION环境变量设置版本。就像是

VERSION=1.0.0alpha1 conda build conda.recipe
Run Code Online (Sandbox Code Playgroud)

在您的buildmeta.yaml 配方部分中,您需要添加一个script_env键来告诉 conda-build 将VERSION环境变量一直传递到构建环境。

build:
  script_env:
    - VERSION
Run Code Online (Sandbox Code Playgroud)