Conan 2.0.13中set_version()未触发,conan create报版本未指定错误
Conan 2.0.13
set_version()未触发导致版本错误问题 Conan版本:2.0.13
我在conan recipe中定义了set_version()方法,用于通过外部脚本设置包版本。但执行conan create .生成包时,出现错误:ERROR: conanfile didn't specify version。看起来必须使用--version参数才能正常运行,且set_version()未被调用。
已知信息:
--version是Conan的可选参数conanfile中已定义set_version()方法- 按预期,执行
conan create或conan export时应自动调用set_version()
补充代码:
def set_version(self): if self.version: return version_script = self.recipe_folder / "scripts" / "version" self.version = check_output([version_script], text=True).strip()
问题排查与解决办法
确认方法定义位置
必须确保set_version()是定义在ConanFile类的内部,而非类外或其他错误位置。位置错误会导致Conan无法识别该方法,自然不会触发调用。验证脚本路径与权限
- 检查
version_script的路径是否正确,确保scripts/version脚本存在于recipe文件夹下。可在方法内添加日志打印路径进行验证:from conan import ConanFile from conan.tools.files import check_output import os class MyRecipe(ConanFile): def set_version(self): if self.version: return version_script = os.path.join(self.recipe_folder, "scripts", "version") self.output.info(f"版本脚本路径: {version_script}") self.version = check_output([version_script], text=True).strip() - 确保
version脚本具备可执行权限(Linux/macOS下执行chmod +x scripts/version),否则脚本无法运行,check_output会抛出异常,导致self.version未被赋值,最终触发版本缺失错误。
- 检查
捕获方法执行异常
Conan 2.x中set_version()确实会在conan create/conan export时自动调用,但如果方法执行过程中出现未捕获的异常,Conan会终止方法执行,导致版本未被设置。可添加异常捕获打印详细信息:def set_version(self): if self.version: return try: version_script = self.recipe_folder / "scripts" / "version" self.version = check_output([version_script], text=True).strip() except Exception as e: self.output.error(f"获取版本失败: {str(e)}") raise排查版本覆盖逻辑
检查recipe中是否有其他代码(如init()方法或其他钩子)修改或清空self.version,导致set_version()设置的版本被覆盖。
内容的提问来源于stack exchange,提问作者Jorge
相关产品推荐
相关产品推荐

