名称和版本字段用于定义常量值。 set_name()和set_version()方法可用于动态定义这些值,例如,如果我们要从文本文件或git存储库中提取版本。
配方的版本在导出(或创建)时存储在包元数据中,以后始终从元数据中获取。 这意味着,一旦配方在缓存中或从服务器安装后,就不会执行set_name()和set_version()方法。 两种方法都将使用当前文件夹作为当前工作目录来解析相对路径。 要定义相对于conanfile.py位置的路径,请使用self.recipe_folder属性。

如何从SCM捕获软件包版本:git

工具中的Git()帮助程序可用于从conanfile.py配方所在的Git存储库中捕获数据,并用于定义Conan软件包的版本。

  1. from conans import ConanFile, tools
  2. class HelloConan(ConanFile):
  3. name = "hello"
  4. def set_version(self):
  5. git = tools.Git(folder=self.recipe_folder)
  6. self.version = "%s_%s" % (git.get_branch(), git.get_revision())
  7. def build(self):
  8. ...

在此示例中,使用conan create创建的包将称为hello / branch_commit @ user / channel。

如何从SCM捕获软件包版本:SVN

工具中的SVN()帮助程序可用于从conanfile.py配方所在的Subversion存储库中捕获数据,并用于定义Conan软件包的版本。

  1. from conans import ConanFile, tools
  2. class HelloLibrary(ConanFile):
  3. name = "hello"
  4. def set_version(self):
  5. scm = tools.SVN(folder=self.recipe_folder)
  6. revision = scm.get_revision()
  7. branch = scm.get_branch() # Delivers e.g trunk, tags/v1.0.0, branches/my_branch
  8. branch = branch.replace("/","_")
  9. if scm.is_pristine():
  10. dirty = ""
  11. else:
  12. dirty = ".dirty"
  13. self.version = "%s-%s+%s%s" % (version, revision, branch, dirty) # e.g. 1.2.0-1234+trunk.dirty
  14. def build(self):
  15. ...

在此示例中,使用柯南创建创建的包将被称为hello / generated_version @ user / channel。 注意:此函数永远不会提高,请参见上面有关何时计算和保存版本的部分。

如何从文本或生成文件中捕获程序包版本

通常,库版本号已经被编码在文本文件,构建脚本等中。举例来说,假设我们具有以下库布局,并且我们想从中创建一个包:

  1. conanfile.py
  2. CMakeLists.txt
  3. src
  4. hello.cpp
  5. ...

CMakeLists.txt将具有一些变量来定义库的版本号。 为简单起见,我们还假设它包含如下一行:

  1. cmake_minimum_required(VERSION 2.8)
  2. set(MY_LIBRARY_VERSION 1.2.3) # This is the version we want
  3. add_library(hello src/hello.cpp)

您可以使用以下方法动态提取版本:

  1. from conans import ConanFile
  2. from conans.tools import load
  3. import re, os
  4. class HelloConan(ConanFile):
  5. name = "hello"
  6. def set_version(self):
  7. content = load(os.path.join(self.recipe_folder, "CMakeLists.txt"))
  8. version = re.search(r"set\(MY_LIBRARY_VERSION (.*)\)", content).group(1)
  9. self.version = version.strip()