使用柯南软件包管理器将文件复制到项目

问题描述

我使用柯南管理我的(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 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

在您的食谱中。您在此功能中所做的所有操作均在当前工作目录中执行,因此您可以在此处下载zip文件,然后将其复制到其位置。 此外,如果希望它们成为最终程序包的一部分,则必须使用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 . 

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

[requires]
MyDats/1.0

[imports]
include,A.dat -> ..\
include,C.dat -> ..\B

您显然可以将conanfile.txt放置在project \ import之外的其他位置,重点是不要在同一位置放置两个配方。

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