将依赖关系列表(需求)与conanfile.py分开

时间:2018-08-13 13:26:31

标签: c++ dependency-management conan

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

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

2 个答案:

答案 0 :(得分:1)

我找到了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")`
    

然后通过以下方式导入require方法并将其分配给柯南类中的require方法:

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将获取库的详细信息,如果在注册表中找到,则将安装这些信息!!

答案 1 :(得分:1)

以上来自@ amit-jaim的答案非常好。我想指出一些其他细节:

  • 有必要{。{1}} .list文件,因为在缓存中使用conanfile时也会使用它。

  • conanfile可以变得更pythonic

代码可能像这样:

<script type="text/javascript">
		function OpenPrintPage() {

			var OriginalContent = document.getElementById('YOUR_ELEMENT').innerHTML;
			var PrintWindow = 	window.open("","PrinterFriendlyPage","scrollbars=yes,status=yes,toolbar=yes,menubar=yes,resizable=yes,height=510,width=750"); 
			
			PrintWindow.document.write( '<html><head><title>' + document.title +'</title></head><body><div id="' + 'content' + '">' + '</div><a class="printbtn" href="javascript:window.print()">Print This Page</a> </body></html>'); 

			PrintWindow.document.close(); 
			PrintWindow.document.getElementById('content').innerHTML += OriginalContent; 
		}

	</script>

如果您希望能够从当前conanfile以外的目录运行exports,则必须获取conanfile的当前位置,例如:

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)