我们计划为我们的C ++代码建立柯南存储库。我们只想向开发人员公开依赖项列表(lib / version @ user / channel),而不是我们放在conanfile.py中的逻辑。我们正在计划这样做,因为我们正在围绕conan创建一个包装器,该包装器将具有多个逻辑,检查。该包装器将向用户公开。他们不需要知道详细的逻辑和构建步骤。
有没有一种方法可以在conanfile.py之外实现需求(依赖项列表),并使该列表对用户可用,以便他们可以选择要使用的库版本-类似(不一样,虽然)到maven世界中的pom.xml吗?
答案 0 :(得分:1)
我找到了2个解决方案:
创建要使用的库列表,然后从需求方法中读取该列表:
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)
在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)