使用包列表

注意

此功能处于预览阶段。这意味着它不太可能被移除,也不太可能发生破坏性更改。维护者将尽可能不破坏它,并且只在非常必要时才这样做。有关更多信息,请参阅Conan 稳定性部分。

包列表是 Conan 的一个强大且便捷的功能,它允许自动化和串联不同的 Conan 命令。让我们看看一些常见的用例。

列出包并下载它们

一个简单的首个用例可能是在服务器中列出一些配方和/或二进制文件,然后下载它们。

我们可以执行任何 conan list 命令,例如,列出所有高于 1.2.11 版本的 zlib、最新的配方修订版、该最新配方修订版的所有 Windows 二进制文件,以及每个二进制文件的最新包修订版。请注意,如果我们稍后确实要下载某些内容,则必须指定 latest 包修订版,否则将只下载配方。

$ conan list "zlib/[>1.2.11]#latest:*#latest" -p os=Windows --format=json -r=conancenter > pkglist.json

命令的输出以 json 格式发送到 pkglist.json 文件中,其内容如下:

pkglist.json(简化版)
"conancenter": {
    "zlib/1.2.12": {
        "revisions": {
            "b1fd071d8a2234a488b3ff74a3526f81": {
                "timestamp": 1667396813.987,
                "packages": {
                    "ae9eaf478e918e6470fe64a4d8d4d9552b0b3606": {
                        "revisions": {
                            "19808a47de859c2408ffcf8e5df1fdaf": {
                            }
                        },
                        "info": {
                            "settings": {
                                "arch": "x86_64",
                                "os": "Windows"
                            }
                        }
                    }
                }
            }
        },
    "zlib/1.2.13": {
    }
}

pkglist.json 中的第一级是“来源”远程仓库,如果列表发生在缓存中,则为“本地缓存”。在本例中,由于我们列出了 conancenter 远程仓库中的包,因此它将是来源。

我们现在可以使用一个 conan download 调用来下载这些配方和二进制文件。

$ conan download --list=pkglist.json -r=conancenter
# Download the recipes and binaries in pkglist.json
# And displays a report of the downloaded things

从一个远程仓库下载并上传到另一个远程仓库

假设我们从上一步下载的包中创建一个新的包列表。

$ conan download --list=pkglist.json -r=conancenter --format=json > downloaded.json
# Download the recipes and binaries in pkglist.json
# And stores the result in "downloaded.json"

生成的 downloaded.json 将与 pkglist.json 文件几乎相同,但在本例中,这些包的“来源”是 "Local Cache"(因为下载的包将位于缓存中)。

downloaded.json(简化版)
"Local Cache": {
        "zlib/1.2.12": {
            "revisions": {
            }
        }
    }

这意味着我们现在可以将这同一组配方和二进制文件上传到不同的远程仓库。

$ conan upload --list=downloaded.json -r=myremote -c
# Upload those artifacts to the same remote

注意

最佳实践

这将是一种在不同服务器仓库之间进行推广的慢速机制。像 Artifactory 这样的服务器提供了无需使用客户端即可直接将包从一个仓库复制到另一个仓库的方法,由于文件去重,这些方法的速度要快几个数量级,因此那是推荐的方法。本节中介绍的方法可能用于气隙环境以及其他无法进行服务器到服务器复制的情况。

构建和上传包

最有趣的流程之一是当某些包通过 conan createconan install --build=xxx 命令在本地缓存中构建时。通常,我们希望将本地构建的包上传到服务器,这样其他人就不必重新构建它们。但我们可能只想上传已构建的二进制文件,而不是所有其他传递性依赖项,或我们之前在本地缓存中拥有的其他包。

可以从 conan installconan createconan graph info 命令的输出中计算包列表。然后,该包列表可用于上传。分步说明:

首先,假设我们有自己的包 mypkg/0.1,并且我们创建它。

$ conan new cmake_lib -d name=mypkg -d version=0.1
$ conan create . --format=json > create.json

这将创建一个图的 JSON 表示,其中包含哪些包已被构建的信息 "binary": "Build"

create.json(简化版)
{
"graph": {
    "nodes": {
        "0": {
            "ref": "conanfile",
            "id": "0",
            "recipe": "Cli",
            "context": "host",
            "test": false
        },
        "1": {
            "ref": "mypkg/0.1#f57cc9a1824f47af2f52df0dbdd440f6",
            "id": "1",
            "recipe": "Cache",
            "package_id": "2401fa1d188d289bb25c37cfa3317e13e377a351",
            "prev": "75f44d989175c05bc4be2399edc63091",
            "build_id": null,
            "binary": "Build"
        }
    }
}

我们可以从这个文件中计算出一个包列表,然后用以下命令将这些工件上传到服务器:

$ conan list --graph=create.json --graph-binaries=build --format=json > pkglist.json
# Create a pkglist.json with the known list of recipes and binaries built from sources
$ conan upload --list=pkglist.json -r=myremote -c

移除包列表

也可以先执行 conan list 创建要移除的项列表,然后移除它们。

# Removes everything from the cache
$ conan list "*#*" --format=json > pkglist.json
$ conan remove --list=pkglist.json  -c

请注意,在这种情况下,由于 conan remove 的破坏性,listremove 中的默认模式是不同的。

  • 当将一个配方传递给 remove 时,例如 conan remove zlib/1.2.13,它将移除 zlib/1.2.13 的配方及其所有二进制文件,因为二进制文件不能脱离配方而存在。

  • 当传递一个 package_id 时,例如 conan remove zlib/1.2.13:package_id,那么该特定的 package_id 将被移除,但配方不会。

因此,如果直接调用 conan remove 或先调用 conan list,例如,移除所有内容的模式将有所不同。

# Removes everything from the cache
$ conan remove "*"
# OR via list, we need to explicitly include all revisions
$ conan list "*#*" --format=json > pkglist.json
$ conan remove --list=pkglist.json  -c

# Removes only the binaries from the cache (leave recipes)
$ conan remove "*:*"
# OR via list, we need to explicitly include all revisions
$ conan list "*#*:*" --format=json > pkglist.json
$ conan remove --list=pkglist.json  -c

有关更多信息,请参阅参考命令部分