名称和版本字段用于定义常量值。 set_name()和set_version()方法可用于动态定义这些值,例如,如果我们要从文本文件或git存储库中提取版本。
配方的版本在导出(或创建)时存储在包元数据中,以后始终从元数据中获取。 这意味着,一旦配方在缓存中或从服务器安装后,就不会执行set_name()和set_version()方法。 两种方法都将使用当前文件夹作为当前工作目录来解析相对路径。 要定义相对于conanfile.py位置的路径,请使用self.recipe_folder属性。
如何从SCM捕获软件包版本:git
工具中的Git()帮助程序可用于从conanfile.py配方所在的Git存储库中捕获数据,并用于定义Conan软件包的版本。
from conans import ConanFile, tools
class HelloConan(ConanFile):
name = "hello"
def set_version(self):
git = tools.Git(folder=self.recipe_folder)
self.version = "%s_%s" % (git.get_branch(), git.get_revision())
def build(self):
...
在此示例中,使用conan create创建的包将称为hello / branch_commit @ user / channel。
如何从SCM捕获软件包版本:SVN
工具中的SVN()帮助程序可用于从conanfile.py配方所在的Subversion存储库中捕获数据,并用于定义Conan软件包的版本。
from conans import ConanFile, tools
class HelloLibrary(ConanFile):
name = "hello"
def set_version(self):
scm = tools.SVN(folder=self.recipe_folder)
revision = scm.get_revision()
branch = scm.get_branch() # Delivers e.g trunk, tags/v1.0.0, branches/my_branch
branch = branch.replace("/","_")
if scm.is_pristine():
dirty = ""
else:
dirty = ".dirty"
self.version = "%s-%s+%s%s" % (version, revision, branch, dirty) # e.g. 1.2.0-1234+trunk.dirty
def build(self):
...
在此示例中,使用柯南创建创建的包将被称为hello / generated_version @ user / channel。 注意:此函数永远不会提高,请参见上面有关何时计算和保存版本的部分。
如何从文本或生成文件中捕获程序包版本
通常,库版本号已经被编码在文本文件,构建脚本等中。举例来说,假设我们具有以下库布局,并且我们想从中创建一个包:
conanfile.py
CMakeLists.txt
src
hello.cpp
...
CMakeLists.txt将具有一些变量来定义库的版本号。 为简单起见,我们还假设它包含如下一行:
cmake_minimum_required(VERSION 2.8)
set(MY_LIBRARY_VERSION 1.2.3) # This is the version we want
add_library(hello src/hello.cpp)
您可以使用以下方法动态提取版本:
from conans import ConanFile
from conans.tools import load
import re, os
class HelloConan(ConanFile):
name = "hello"
def set_version(self):
content = load(os.path.join(self.recipe_folder, "CMakeLists.txt"))
version = re.search(r"set\(MY_LIBRARY_VERSION (.*)\)", content).group(1)
self.version = version.strip()