注册:把你自己的库带到vcpkg

特别感谢Nicole Mazzuca提供了这篇博文的内容。

null

您是否正在处理一个具有库依赖关系的C++项目?您是否厌倦了用胶带和git子模块维护定制的包管理工作流?然后您应该考虑尝试使用包管理器。也许您已经关注vcpkg一段时间了,它看起来是您的团队的完美解决方案,但有一个问题:并不是所有的依赖项都是开源的!你的公司有内部图书馆,他们希望每个人都能使用。

vcpkg能否处理非开源依赖项?

对!到目前为止,您最好的选择包括破解覆盖端口或分叉vcpkg端口树。但仍有改进的余地。现在,我们很高兴宣布一个特性,它可以管理您想要的任何库,无论它们是仅限内部的、开源的、您自己的开源项目分支等等。在这篇博文中,我们将深入探讨 登记处 ,我们的新实验特性。我们很乐意让您尝试这个功能,给我们反馈,并帮助我们使它成为最好的功能!

注册入门

所以,我们讨论了注册的原因;现在让我们来讨论如何。假设我们是North Wind Traders的开发人员,我们公司有一个GitHub Enterprise订阅。当然,根据你的公司甚至你的个人情况,你可以使用任何你已经在使用的解决方案。本文的目标是建立一个git注册表,这是最常见的注册表类型。

1.新建注册表

公司的GitHub组织位于 https://github.com/northwindtraders ,可用于设置注册表。我们将在以下位置创建注册表: https://github.com/northwindtraders/vcpkg-registry ,因为这是一个很好的名字,你可以跟着那里的树枝走。

一旦我们创建了这个注册表,我们就必须做一些事情来实际设置它以包含我们想要的包,在这里是我们的内部JSON和Unicode库。

  • 首先,我们将设置一个空基线,这是对注册表的最低要求。
  • 然后,我们将添加库需要构建的文件,并确保它们正常工作。
  • 最后,我们将把库添加到注册表中,方法是将它添加到版本数据库中,并写下在git存储库中找到库的位置。

2.创建空注册表基线

所以,让我们开始吧。克隆(空)存储库,并在顶级版本目录下添加一个baseline.json文件,其中仅包含以下内容:

{
"default": {}
}

3.为库创建vcpkg端口

现在,让我们为两个库中的第一个库Unicode库设置一个端口条目 北码 . 如果你曾经写过一个端口,你知道如何做到这一点,但是对于那些没有写过的人,让我们照样来看看。

我们首先为端口创建一个文件夹;按照vcpkgcentralregistry的标准,我们将调用文件夹端口。因为我们使用一个稳定的git标识符来指定目录,所以我们不需要将它放在特定的位置,但最好遵循习惯用法。在这个端口目录中,创建beicode的端口目录;在里面放两个空文件, 端口文件.cmake vcpkg.json文件 .

此时,注册表目录应如下所示:

ports/
    beicode/
        portfile.cmake
        vcpkg.json
versions/
    baseline.json

现在,让我们填写港口。首先,因为beicodegithub存储库已经有了vcpkg.json清单,所以将其复制到 vcpkg.json文件 您创建的文件:

{
  "name": "beicode",
  "version": "1.0.0",
  "description": "A simple utf-8 based unicode decoding and encoding library",
  "homepage": "https://github.com/northwindtraders/beicode"
}

4.使用覆盖层测试新的vcpkg端口

让我们通过尝试安装端口来确保这是可行的;我们还没有使用注册表,只是使用预先存在的覆盖端口功能来测试:

> vcpkg install beicode --overlay-ports=vcpkg-registry/ports/beicode

我们应该得到一个错误:“ 文件夹/包含为空或不存在 ”. 既然我们现在什么都没做,那就说得通了。所以,让我们填写我们的港口!因为我们的端口是一个简单的CMake库,所以我们可以创建一个非常简单的 端口文件.cmake :

vcpkg_from_github(
  OUT_SOURCE_PATH SOURCE_PATH
  REPO northwindtraders/beicode
  REF 19a1f95c2f56a27ced90227b5e2754a602a08e69
  SHA512 7b2bb7acb2a8ff07bff59cfa27247a7b2cced03828919cd65cc0c8cf1f724f5f1e947ed6992dcdbc913fb470694a52613d1861eaaadbf8903e94eb9cdfe4d000
  HEAD_REF main
)

vcpkg_configure_cmake(
  SOURCE_PATH "${SOURCE_PATH}"
  PREFER_NINJA
)
vcpkg_install_cmake()
vcpkg_fixup_cmake_targets()

file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/include")

file(
  INSTALL "${SOURCE_PATH}/LICENSE"
  DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}"
  RENAME copyright)

如果我们逃跑

> vcpkg install beicode --overlay-ports=vcpkg-registry/ports/beicode

再次,我们将看到它成功安装!我们已经为注册表编写了第一个端口,现在只需将端口添加到注册表中设置的版本中。

5.在注册表中指定库的每个版本

每个端口的版本数据都存在于自己的文件中: 版本/[first character]-/[portname].json . 例如,的版本数据 fmt公司 会住在 版本/f-/fmt.json ; 的版本数据 兹利布 会住在 版本/z-/zlib.json . 所以,为了 北码 ,创建 版本/b-/beicode.json :

{
  "versions": [
    {
      "version": "1.0.0",
      "git-tree": ""
    }
  ]
}

并将以下内容添加到 版本/baseline.json :

{
  "default": {
    "beicode": { "baseline": "1.0.0", "port-version": 0 }
  }
}

最后,让我们想一想该放什么进去“ git树 “现场。对beicode端口树执行git提交(但不要推送),以确保git知道它:

> git add ports/beicode
> git commit -m "[beicode] new port"

然后获取该目录的树标识符:

> git rev-parse HEAD:ports/beicode

你应该得到这样的东西 7fb5482270b093d40ab8ac31db89da4f880f01ba ; 把它放在 git树 “在 beicode.json文件 ,并提交新文件:

> git add versions
> git commit --amend --no-edit

我们应该完蛋了!我们之所以要跳这种略显复杂的舞蹈,是为了能准确地获取我们想要的版本的文件;其他版本将存在于存储库的历史记录中,因此总是要签出。

6、在C++项目中从VCPKG注册表中使用库

完成之后,让我们尝试在示例代码库中使用新注册表中的库。在注册表之外创建一个目录,并将其更改为该目录。创建 vcpkg.json文件 这取决于代码:

{
"name": "test",
"version": "0",
"dependencies": [
  "fmt",
  "beicode"
]
}

和一个 vcpkg-configuration.json文件 将注册表设置为git注册表:

{
  "registries": [
    {
      "kind": "git",
      "repository": "[full path to]/vcpkg-registry",
      "packages": [ "beicode", "beison" ]
    }
  ]
}

并尝试vcpkg安装:

> vcpkg install --feature-flags=registries,manifests

如果成功了,那么您就可以将注册表推向上游了!您可以替换“ 存储库 “你的领域 vcpkg-configuration.json文件 包含实际上游存储库URL的文件。

vcpkg如何从注册表解析库

您会注意到beicode和beison来自我们创建的注册表;这是因为我们在vcpkg-configuration.json中明确指出了它们的来源。因为我们没有说fmt应该来自哪里,所以它只是来自默认注册表,在本例中是vcpkg本身附带的注册表。登记册从不可传递;如果您将beicode从vcpkg-configuration.json中的注册表中删除,这将无法工作,因为beicode在默认注册表中不存在,vcpkg将在那里查找它。如果您想用自己的副本覆盖fmt,可以将其添加到注册表,然后将其添加到packages字段。

包装贝森将大致相同,只是用不同的名称。您可以自己尝试一下,然后看看您的代码是否与 上游 .

给我们你的反馈!

通过访问我们的 GitHub回购 . 我们欢迎您对该工具和新功能的反馈 在我们的问题追踪器中 或者在 vcpkg@microsoft.com . 我们一直希望改善您的体验。看看vcpkg的下一步是什么, 查看我们的路线图 .

© 版权声明
THE END
喜欢就支持一下吧,技术咨询可以联系QQ407933975
点赞0 分享