工作区文件

警告

此功能是新孵化功能的一部分。这意味着它仍在开发中,并正在寻求用户测试和反馈。更多信息请参阅 孵化功能章节

工作区由 conanws.yml 和/或 conanws.py 文件定义,它们将确定“根”工作区文件夹。

conanws.yml

工作区最基本的实现是 conanws.yml 文件。它定义了工作区的 packages(可编辑的包)。例如,一个定义了2个 packages 的工作区 conanws.yml 可能是

conanws.yml
packages:
   - path: dep1
     ref: dep1/0.1
   - path: dep2
     ref: dep2/0.1

此外,它也可以不包含 ref 字段,并让 Conan 从各自的 路径/conanfile.py 中读取 名称/版本

conanws.yml
packages:
   - path: dep1
   - path: dep2

conanws.py

一个 conanws.yml 文件可以通过一个更强大的 conanws.py 文件进行扩展,后者与 ConanFile 和其 conandata.yml 之间的关系类似。如果我们想动态定义 packages,例如根据文件夹中是否存在 name.txtversion.txt 文件,这些包可以在 conanws.py 中定义为

conanws.py
import os
from conan import Workspace

class MyWorkspace(Workspace):

   def packages(self):
      result = []
      for f in os.listdir(self.folder):
         if os.path.isdir(os.path.join(self.folder, f)):
            with open(os.path.join(self.folder, f, "name.txt")) as fname:
               name = fname.read().strip()
            with open(os.path.join(self.folder, f, "version.txt")) as fversion:
               version = fversion.read().strip()
            result.append({"path": f, "ref": f"{name}/{version}"})
      return result

还可以重用 conanfile.py 的逻辑,在 set_name()set_version() 方法中,使用 Workspace.load_conanfile() 辅助函数

conanws.py
import os
from conan import Workspace

class MyWorkspace(Workspace):
   def packages(self):
      result = []
      for f in os.listdir(self.folder):
         if os.path.isdir(os.path.join(self.folder, f)):
            conanfile = self.load_conanfile(f)
            result.append({"path": f, "ref": f"{conanfile.name}/{conanfile.version}"})
      return result

另请参阅

阅读 工作区教程 章节。