set_version()

动态定义 version 属性。当同一个配方用于创建相同包的不同版本,并且该版本在其他地方定义时(例如在 git 分支或文本或构建脚本文件中),可能需要此方法。这是一种常见情况。

此方法仅在配方导出到缓存(使用 conan createconan export)时,以及在本地使用配方时(例如使用 conan install .)执行。在所有其他情况下,包的版本已完全定义,并且不会调用 set_version(),因此除了定义 self.version 值之外,请勿依赖它实现任何其他功能。

如果当前包版本定义在 version.txt 文件中,可以这样做:

from conan import ConanFile
from conan.tools.files import load

class Pkg(ConanFile):
    def set_version(self):
        # This will execute relatively to the current user directory (version.txt in cwd)
        self.version = load(self, "version.txt")
        # if "version.txt" is located relative to the conanfile.py better do:
        self.version = load(self, os.path.join(self.recipe_folder, "version.txt"))

包版本也可以通过命令行参数 --version=xxxx 为某些命令定义。如果我们要优先使用命令行参数,应该这样做:

from conan import ConanFile
from conan.tools.files import load

class Pkg(ConanFile):
    def set_version(self):
        # Command line ``--version=xxxx`` will be assigned first to self.version and have priority
        self.version = self.version or load(self, "version.txt")

一个常见的使用场景是根据某些版本控制机制(例如当前的 git 标签)动态定义 version。这可以通过以下方式完成:

from conan import ConanFile
from conan.tools.scm import Git

class Pkg(ConanFile):
    name = "pkg"

    def set_version(self):
        git = Git(self, self.recipe_folder)
        self.version = git.run("describe --tags")

set_version() 方法可以决定定义 version 值,而不受潜在的 --version=xxx 命令行参数的影响,该参数甚至可以被 set_version() 完全忽略。开发者有责任提供一个正确的 set_version() 方法。

def set_version(self):
    # This will always assign "2.1" as version, ignoring ``--version`` command line argument
    # and without erroring or warning
    self.version = "2.1"

如果提供了命令行参数 --version=xxx,它将初始化到 self.version 属性中,因此 set_version() 方法可以读取并使用它。

def set_version(self):
    # Takes the provided command line ``--version`` argument and creates a version appending to
    # it the ".extra" string
    self.version = self.version + ".extra"

警告

set_version() 方法是 version 属性的替代方案。不建议或不支持同时定义 version 类属性和 set_version() 方法。