set_version()¶
动态定义 version
属性。当同一个 recipe 用于创建同一 package 的不同版本,并且该版本定义在其他地方(例如 git 分支、文本文件或构建脚本文件)时,可能需要此方法。这是一种常见的情况。
此方法仅在 recipe 导出到缓存中时(使用 conan create
和 conan export
命令),以及 recipe 在本地使用时(例如使用 conan install .
命令)执行。在所有其他情况下,package 的版本已完全定义,并且不会调用 set_version()
,因此不要依赖它来实现定义 self.version
值以外的任何其他功能。
如果当前 package 版本定义在 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"))
package 版本也可以通过某些命令的命令行参数 --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()
是开发者的责任。
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()
方法。