【问题标题】:Use Conan package manager to copy files to project使用柯南包管理器将文件复制到项目
【发布时间】:2020-08-25 12:13:12
【问题描述】:

我使用 Conan 来管理我的 (c++) 项目中的依赖项。 现在我在项目中需要一些比较大的文件,不应该签入到git中。我在 http 服务器上有这些文件,并希望通过柯南配方下载它们并在我的项目中提供它们(这些文件是完成的二进制文件所需要的,与构建过程本身无关)。

但我无法让柯南将文件复制到正确的位置,这是我的尝试:

from conan's import ConanFile, tools

class MyPackage(ConanFile):
    name = "package"
    version = "11.28"
    author = "Whatever"
    keep_imports = True
    exports = "*"

    def source(self):
        tools.get("http://just/a/file.zip")

    def imports(self):
        self.copy("*", dst="content")

    def package(self):
        self.copy("*")

    def package_id(self):
        self.info.header_only()

例如,如果我的项目位于 C:\dev\project 下,并且文件 A.dat、B/C.dat 位于“file.zip”中,我希望将它们放在 c:\ dev\project\\A.dat 或 c:\dev\project\\B\C.dat

问题是当我运行配方时,文件位于 \package\11.28\ (...) \package\A.dat 或 \package\11.28\ (...) \package\B\C.dat (另外也在 \package\11.28\ ... \source 下,但这并不重要) 而不是在 c:\dev\project...

【问题讨论】:

    标签: conan


    【解决方案1】:

    你在打电话

    conan create .
    

    当你运行我想的食谱时。实际上,您无法修改运行 conan create 的本地文件夹,但此规则有一个例外: 如果你定义一个

    set_version(self): 
        self.version = "11.28"
        # do whatever you want in your local folder
        # e.g. tools.get("http://just/a/file.zip")
        # and unpack your files into A.dat and B/C.dat
    

    在你的食谱里面。你在这个函数中所做的一切都是在你当前的工作目录中执行的,所以你可以在这里下载你的 zipfile 并将其中的文件复制到它们的位置。 此外,如果您希望这些文件成为最终包的一部分,则必须选择具有 exports_sources 属性的文件:

    exports_sources = "A.dat","B/C.dat"
    

    这是一种 hack,但是应该避免。 尝试使用以下方法将您的文件“A.dat”和“C.dat”打包到一个自己的包中,例如 MyDats/1.0

    class MyPackage(ConanFile):
        name = "MyDats"
        version = "1.0"
    
        def source(self):
            tools.get("http://just/a/file.zip")
            # unpack files into A.dat and C.dat herein..
    
        def package(self):
            self.copy("*", dest = "include", keep_path = False)
    
        def package_id(self):
            self.info.header_only()
    
    

    顺便说一句:您通常不需要指定 export = "*",唯一应该导出的是运行配方本身所必需的文件(不是源代码或您的文件 A. dat, C.dat)。

    当你打电话时

    conan create . 
    

    在此它将打包您的文件并将它们本地安装在您的缓存中。 然后在本地项目的文件夹 C:\dev\project\import\ 中放置一个 conanfile.txt,其中包含:

    [requires]
    MyDats/1.0
    
    [imports]
    include, A.dat -> ..\
    include, C.dat -> ..\B
    

    您显然可以将您的 conanfile.txt 放在 project\import 之外的另一个位置,重点是不要在同一位置有两个食谱。

    如果您完成的二进制文件中需要这些文件,您应该将它们包含到您的项目包中,但据我所知,这是您无意中所做的。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多