巴拉巴

 找回密码
 立即注册

站内搜索

搜索
热搜: 活动 交友 discuz
查看: 46|回复: 0

如何将个人代码库导入到vcpkg?

[复制链接]

1

主题

4

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2023-6-9 16:59:43 | 显示全部楼层 |阅读模式
非常感谢Nicole Mazzuca贡献了本文的内容。
你是否正在开发一个依赖于其他库代码的C++工程呢?长年累月地使用各种”胶水脚本”和git submodules来维护库代码的各种”花样”构建是否让你心生疲倦?
是时候试试包管理器了!
也许你之前听人说到过”vcpkg”,看起来这个工具非常适合你的开发团队,但是有一个问题:并不是所有的依赖代码都是开源的,另外,公司也有一些供内部使用的库代码。
vcpkg可以支持非开源的代码库吗?
是的。在此之前,处理非开源代码库的方式是在代码上做一些”Hacking”,或者克隆整个vcpkg里的代码库。很显然,这里还有很大的提升空间。现在,我们高兴地宣布一项实验性的新特性,它可以用来管理你想要使用的任何代码库,不管它们是内部使用的私有代码库,还是开源代码,或者是你克隆出来的其他开源代码。在今天的文章中,我们将重点介绍这项全新特性,名为”registries”。
祝阅读愉快!
registries入门
上面我们已经讲解了为什么需要registries,现在我们来探讨一下如何使用registries。
假设,我们是North Wind Traders的开发工程师,我们的公司购买了一份GitHub的企业版本。当然,基于公司或者个人的实际情况,你可以继续使用目前的工作流程。
这篇文章的主要目的是配置一个最为常见的git registry。
1. 创建一个新的registry
我们先在GitHub上创建一个名为vcpkg-registry的registry,然后我们向里面添加我们需要的代码库,在这个例子中,我们以JSON库和Unicode库为例。
> 首先,我们将要设置一个空的基线版本,这是对于一个registry的最小要求。
> 然后,我们向代码库中添加代码,并确保它们可以编译通过。
> 最后,通过配置版本数据库和代码库在git仓库中的路径,我们将代码库添加到registry中。
2. 创建一个空的registry基线版本
那让我们开始吧。克隆一个空的仓库,然后在根目录添加一个baseline.json文件,文件的内容如下图所示:

3. 在代码库中创建一个vcpkg port
现在,让我们为两个库中的第一个代码库(beicode的Unicode版本)设置一个port条目。如果你曾经编写过port,那么你将知道如何执行此操作,但是对于那些还没有写过port的人,让我们还是进行一下操作用于参考。
首先,我们为要使用的port创建一个目录。 按照vcpkg central registry的标准,我们将其称为folder ports。由于我们使用稳定的git标识符来指定目录,因此无需将其放在特定位置,但是遵循习惯用法是很好的。在这个ports目录中,创建beicode的port目录,在其中放置两个空文件:portfile.cmake和vcpkg.json。
此时,注册表目录应如下所示:

现在,让我们来填入我们的port。首先,因为beicode代码库已经有了一个vcpkg.json的manifest,我们需要拷贝这份信息到你刚才创建的vcpkg.json文件中,如下图所示:

4. 使用overlays测试新的vcpkg port
让我们通过尝试安装port来确保此方法有效,我们还没有使用注册表,仅使用预先已经存在的overlay-ports功能来测试内容:
> vcpkg install beicode –overlay-ports=vcpkg-registry/ports/beicode
我们应该会得到一个错误: “文件夹 /include为空或不存在”。既然我们还没有做任何事情,所以这个错误提示是正常的。因此,让我们填写我们的port吧!由于我们的端口是一个简单的CMake库,因此我们可以创建一个非常简单的portfile.cmake,如下图所示:

如果我们执行下面的指令:
> vcpkg install beicode –overlay-ports=
vcpkg-registry/ports/beicode
再一次地,我们将看到它已成功安装! 我们已经为注册表编写了第一个port,现在要做的就是将这个port添加到注册表中设置的版本中。
5. 指定你的代码库在注册表中的每一个版本
每个port的版本数据都保存在自己的文件中:versions / [第一个字符]-/ [portname] .json。 例如,fmt的版本数据将存在于versions / f- / fmt.json中; zlib的版本数据将存在于versions / z- / zlib.json中。 因此,对于beicode,请创建版本/b-/beicode.json:

然后添加如下的信息到versions/baseline.json中:

最后,让我们弄清楚要在”git-tree”字段中添加什么:对beicode port tree进行git commit(但不要执行git push), 以确保git知道这一点,如下图所示:

然后,我们就可以通过如下命令获取这个目录的标识符:
> git rev-parse HEAD:ports/beicode
你会得到类似”7fb5482270b093d40ab8ac31db89da4f880f01ba”的字符串,将这个字符串添加到beicode.json中,然后提交这个新的文件:
> git add versions
> git commit –amend –no-edit
应该查不到快完成我们的工作了!
我们必须进行这种稍微复杂的工序的原因是,我们可以准确地获取所需版本的文件。其他版本将存在于存储库的历史记录中,因此总是可以在那里检出。
6. 在C++工程中使用vcpkg注册表中的代码库
完成上面的操作后,让我们尝试在示例代码库中使用新注册表中的代码库。在注册表之外创建一个目录,然后切换到该目录。创建一个依赖于beicode的vcpkg.json,如下图所示:

然后,添加一个vcpkg-configuration.json来作为一个注册表:

执行以下指令进行安装:
> vcpkg install –feature-flags=registries,manifests
如果可行,那么你就可以向上游推送注册表信息了!你还可以通过将vcpkg-configuration.json文件中的”repository”字段替换为实际的上游存储库URL,来尝试使用实际的远程注册表。
vcpkg如何从注册表解析代码库?
你可能会注意到,beicode和beison来自我们创建的注册表,这是因为我们在vcpkg-configuration.json中明确指出了它们的来源。由于我们尚未说明fmt的来源,因此它仅来自默认注册表,在这种情况下,该注册表是vcpkg本身附带的注册表。注册表永远不会传递,如果你从vcpkg-configuration.json中的注册表中删除了beicode,则该操作将无法正常工作,因为默认注册表中不存在beicode,而vcpkg将在其中寻找它。如果要使用自己的副本覆盖fmt,可以将其添加到注册表中,然后将其添加到”软件包”字段中。
代码包beison将是相同的,只是名称不同而已。Ni可以自己尝试一下,然后查看你的代码是否与上游代码不同。
总结
我觉着吧:这项功能非常有助于在大型工程中导入企业内部的代码包,这会是一项十分有吸引力的特性。
最后
Microsoft Visual C++团队的博客是我非常喜欢的博客之一,里面有很多关于Visual C++的知识和最新的开发进展。大浪淘沙,如果你对Visual C++这门古老的技术还是那么感兴趣,则可以经常去他们那(或者我这)逛逛。
本文来自:《Registries: Bring your own libraries to vcpkg》


来源:http://www.yidianzixun.com/article/0owUBcsE
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 返回顶部