You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Conan v2.11执行create命令时无法访问命令运行目录下的文件

Conan v2.11执行create命令时无法访问命令运行目录下的文件

这是Conan 2.x的典型特性——它是缓存优先的构建工具,所有构建、打包操作默认都会在本地缓存目录(.conan2/p/...)中执行,不会直接使用你运行conan create的工作目录。你遇到的问题,核心是没搞清楚Conan 2中exports_sources的作用,以及缓存内各目录的隔离逻辑。

先帮你理清关键逻辑

  1. exports_sources = "."其实已经生效了——它把你本地运行conan create目录下的所有文件,复制到了缓存的self.recipe_folder(也就是你输出里的C:\Users\jim\.conan2\p\badl5fe3d4cc2e7b1\e)。
  2. 但Conan不会自动把recipe_folder里的文件同步到build_folder或source_folder——这几个缓存目录是相互隔离的,需要你手动处理文件的复制,或者用Layout系统自动管理。
  3. 你在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 13:38:07