3

我们计划为我们的 C++ 代码建立柯南存储库。我们只想向开发人员公开依赖项列表(lib/version@user/channel),而不是我们放在 conanfile.py 中的逻辑我们正在计划这样做,因为我们正在围绕 conan 创建一个包装器,它将有几个逻辑和检查。这个包装器将暴露给用户。他们不需要知道详细的逻辑和构建步骤。

有没有办法在 conanfile.py 之外实现需求(依赖项列表),并使列表对用户可用,以便他们可以选择他们想要使用的库的哪个版本 - 类似的东西(虽然不一样) Maven 世界中的 pom.xml ?

4

2 回答 2

3

@amit-jaim 的上述回答非常好。我想指出一些进一步的细节:

  • .list 文件是必需exports的,因为在缓存中使用 conanfile 时也会使用它

  • conanfile 可以做得更 Pythonic

代码可能是这样的:

from conans import ConanFile, load


class HelloConan(ConanFile):
    name = "Hello"
    version = "0.1"
    exports = "deps.list"

    def requirements(self):
        for r in load("deps.list").splitlines():
            self.requires(r)

如果您希望能够conan create从当前 conanfile 以外的目录运行,则需要获取 conanfile 的当前位置,例如:

def requirements(self):
   f = os.path.join(os.path.dirname(__file__), "deps.list")
   for r in load(f).splitlines():
      self.requires(r)
于 2018-08-13T16:59:48.340 回答
2

我找到了 2 个解决方案:

  1. 创建要使用的库列表,然后从需求方法中读取:

    localhost$ cat dependencies.list
    lib1/0.0.1@user/stable
    lib2/1.6.0@user/stable
    lib3/1.5.0@suer/stable
    

请记住,在我们将它们传递给方法的方式中,值不应该有任何引号self.requires()。现在conanfile.py按以下方式定义需求方法:

def requirements(self):
    try:
        with open("/path/to/dependencies.list") as c:
            line=c.readline()
            while line:
                self.requires(line)
                line=c.readline()
    except Exception as ex:
        print(ex)
  1. 在 conanfile.py 之外定义需求方法。如果库依赖是有条件的,请使用此方法。

    localhost$ cat requires.py
    def requires(self):
        self.requires("lib1/0.0.1@user/stable")
        self.requires("lib2/2.6.0@user/stable")
        if self.options.shared:
            self.requires("lib3/1.5.0@user/stable")
        else:
            self.requires("lib3/1.5.1@user/stable")`
    

然后导入 requires 方法并将其分配给 conan 类中的 requirements 方法,方法如下:

from conans import ConanFile, CMake, tools
from requires import requires
class HelloConan(ConanFile):
    name = Hello
    version = "0.0.1"
    license = "LICENSE"
    url = "URL"
    description = "libHello, Version 0.0.1"
    settings = "os", "compiler", "build_type", "arch"
    ....
    ....

现在不要使用 def requirements(self) 定义需求方法,而是这样做:

    requirements=requires
    ....
    ....

而已 !!conan install将获取库详细信息,如果在注册表中找到,将安装它们!

于 2018-08-13T16:33:27.110 回答