set_version()¶
动态定义 version 属性。当同一个配方用于创建同一软件包的不同版本,并且该版本在其他地方定义(例如在 git 分支或文本或构建脚本文件中)时,可能需要此方法。这种情况很常见。
此方法仅在配方被导出到缓存 conan create 和 conan 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() 方法。