特别感谢Nicole Mazzuca提供了这篇博文的内容。
您是否正在处理一个具有库依赖关系的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的下一步是什么, 查看我们的路线图 .