Conan v2.11执行create命令时无法访问命令运行目录下的文件
Conan v2.11执行create命令时无法访问命令运行目录下的文件
这是Conan 2.x的典型特性——它是缓存优先的构建工具,所有构建、打包操作默认都会在本地缓存目录(.conan2/p/...)中执行,不会直接使用你运行conan create的工作目录。你遇到的问题,核心是没搞清楚Conan 2中exports_sources的作用,以及缓存内各目录的隔离逻辑。
先帮你理清关键逻辑
exports_sources = "."其实已经生效了——它把你本地运行conan create目录下的所有文件,复制到了缓存的self.recipe_folder(也就是你输出里的C:\Users\jim\.conan2\p\badl5fe3d4cc2e7b1\e)。- 但Conan不会自动把
recipe_folder里的文件同步到build_folder或source_folder——这几个缓存目录是相互隔离的,需要你手动处理文件的复制,或者用Layout系统自动管理。 - 你在
build步骤中直接用self.recipe_folder作为ant的工作目录,虽然能找到文件,但ant生成的dist/*.zip会留在recipe_folder,而你package步骤里的src="."指向的是缓存的build_folder,自然找不到产物。
给你两个修复方案,推荐第二种(符合Conan 2最佳实践)
方案1:手动同步缓存目录的文件(快速修复)
修改你的build和package方法,确保文件和构建产物在正确的目录流动:
from conan import ConanFile from conan.tools.files import copy import os class MyPackConan(ConanFile): name = "mypack" version = "1.7.0" exports_sources = "." def build(self): # 1. 把recipe目录下的所有文件复制到build目录(构建应该在build目录执行) copy(self, "*", src=self.recipe_folder, dst=self.build_folder) # 2. 在build目录运行ant package,生成的dist会留在build目录 self.run("ant package", cwd=self.build_folder) def package(self): # 3. 从build目录复制生成的zip包到package目录 copy(self, pattern="dist/*.zip", src=self.build_folder, dst=self.package_folder, keep_path=False) def package_id(self): self.info.requires.full_recipe_mode()
方案2:使用Conan Layout系统(推荐,更简洁)
Conan 2推荐用layout来标准化项目目录结构,它会自动帮你同步本地文件到缓存的build/source目录,不需要手动复制:
from conan import ConanFile from conan.tools.files import copy from conan.tools.layout import basic_layout class MyPackConan(ConanFile): name = "mypack" version = "1.7.0" exports_sources = "**" # 用**明确导出所有子目录和文件,比"."更清晰 def layout(self): # 使用基础布局,Conan会自动把本地文件同步到缓存的build目录 basic_layout(self) def build(self): # 直接在build目录运行ant,文件已经自动同步过来了 self.run("ant package", cwd=self.build_folder) def package(self): # 从build目录复制产物到package目录 copy(self, pattern="dist/*.zip", src=self.build_folder, dst=self.package_folder, keep_path=False) def package_id(self): self.info.requires.full_recipe_mode()
验证方法
你可以在generate方法里加一行代码,确认文件是否在预期的目录:
print(f"Recipe folder files: {os.listdir(self.recipe_folder)}") print(f"Build folder files: {os.listdir(self.build_folder)}")
如果能看到build.xml等文件,说明同步成功了。
备注:内容来源于stack exchange,提问作者simgineer
相关产品推荐
相关产品推荐

