Github submodule实用性的一些问题(CC++)
- 内容介绍
- 文章标签
- 相关推荐
感觉其实是C++才会出现的问题。情景如下:
MemoryManager作为一个单独的模块,为整个项目服务。但是其依赖于json库,为日志导出提供服务。然而另一个模块,比如是EntityManager,要依赖于MemoryManager,但是同时也依赖于json,那么这个时候json库到底该怎么办?
是作为MemoryManager的submodule吗?还是作为整个大项目的submodule?
就很难搞。
之前我看过skia(高级渲染api),他们采用的方式好像是自己有一套依赖管理(具体我忘了)所以不存在这个问题。
cmake也提供了下载依赖的方式不过我其实并不太喜欢这样。目前采用的方案就是cmake自动探测target,如果有就不再引入依赖,如果没有就cmake下载。不过这样其实也并不是很优雅,因为不太对称,这要求项目中只能有一个库包含了某个子模块,而其他库只能探测,或者cmake依赖而不是submodule。就很不优雅。
思来想去或许最优雅的方式就是python写个脚本来管理?
我觉得submodule最大的问题就是没法做到同项目submodule依赖的传播。但是我又很想用因为看到仓库里有那个小箭头链接有点爽。
大家有没有更棒的处理办法?
--【壹】--:
我试过,还带了交叉编译的功能,但我真写不来zig,没办法直接用,不是很舒服的方案
--【贰】--:
是,所以才说是只存在于C/C++的问题呀
--【叁】--:
不是有vcpkg么,我没高强度用,不过应该还可以吧
cmake+项目级的vcpkg
--【肆】--:
vcpkg也结决不了这种问题呀。cmake链接的时候该怎么做还是怎么做,它只不过是把多个对同一个库的依赖路由到自己管理的同一个库
说的不太对,改一改,就是说,giehub submodule依赖是没法传递的,如果一个大项目的两个submodule同时依赖了同一个库,就会在本地仓库那边拉两次同一目录
和vcpkg不在一个层面
--【伍】--:
submodule的话,是不是可以用fetch content呀。好久没写cmake,有点忘记了。
--【陆】--:
总的说单cmake方案是完美的没错,先探测,不存在就下载一点问题没有也很完善,但是但凡用一点submodule就不行了
--【柒】--:
但是submodule在仓库里看起来是真的棒啊 实在不想不用,也确实是没有办法了
--【捌】--:
额……好像 zig 可以作为 C++ 的包管理器,是不是有去重功能来着
--【玖】--:
MemoryManager 别导出 json 相关的符号。前几天我遇到一个很类似的,ai 说最小改动就是有一个别导出符号
--【拾】--:
没有太理解,使用find_package 然后target_link应该就行了吧
--【拾壹】--:
是解决不了
但是vcpkg似乎会让依赖到同一个baseline上,能缓解这种问题
然后也不需要用submodule这种方式了
--【拾贰】--:
原来是这个意思
其实别的语言也会有这个问题,但通常不会遇到,似乎都是直接暴力新版本覆盖掉旧
不过Cargo这个处理得还是有点意思的
--【拾叁】--:
不过要是都这么复杂了,可以考虑一下Rust,Rust的Cargo似乎是原生支持你这个行为的,那个就爽了,不用cpp这种野方案了
感觉其实是C++才会出现的问题。情景如下:
MemoryManager作为一个单独的模块,为整个项目服务。但是其依赖于json库,为日志导出提供服务。然而另一个模块,比如是EntityManager,要依赖于MemoryManager,但是同时也依赖于json,那么这个时候json库到底该怎么办?
是作为MemoryManager的submodule吗?还是作为整个大项目的submodule?
就很难搞。
之前我看过skia(高级渲染api),他们采用的方式好像是自己有一套依赖管理(具体我忘了)所以不存在这个问题。
cmake也提供了下载依赖的方式不过我其实并不太喜欢这样。目前采用的方案就是cmake自动探测target,如果有就不再引入依赖,如果没有就cmake下载。不过这样其实也并不是很优雅,因为不太对称,这要求项目中只能有一个库包含了某个子模块,而其他库只能探测,或者cmake依赖而不是submodule。就很不优雅。
思来想去或许最优雅的方式就是python写个脚本来管理?
我觉得submodule最大的问题就是没法做到同项目submodule依赖的传播。但是我又很想用因为看到仓库里有那个小箭头链接有点爽。
大家有没有更棒的处理办法?
--【壹】--:
我试过,还带了交叉编译的功能,但我真写不来zig,没办法直接用,不是很舒服的方案
--【贰】--:
是,所以才说是只存在于C/C++的问题呀
--【叁】--:
不是有vcpkg么,我没高强度用,不过应该还可以吧
cmake+项目级的vcpkg
--【肆】--:
vcpkg也结决不了这种问题呀。cmake链接的时候该怎么做还是怎么做,它只不过是把多个对同一个库的依赖路由到自己管理的同一个库
说的不太对,改一改,就是说,giehub submodule依赖是没法传递的,如果一个大项目的两个submodule同时依赖了同一个库,就会在本地仓库那边拉两次同一目录
和vcpkg不在一个层面
--【伍】--:
submodule的话,是不是可以用fetch content呀。好久没写cmake,有点忘记了。
--【陆】--:
总的说单cmake方案是完美的没错,先探测,不存在就下载一点问题没有也很完善,但是但凡用一点submodule就不行了
--【柒】--:
但是submodule在仓库里看起来是真的棒啊 实在不想不用,也确实是没有办法了
--【捌】--:
额……好像 zig 可以作为 C++ 的包管理器,是不是有去重功能来着
--【玖】--:
MemoryManager 别导出 json 相关的符号。前几天我遇到一个很类似的,ai 说最小改动就是有一个别导出符号
--【拾】--:
没有太理解,使用find_package 然后target_link应该就行了吧
--【拾壹】--:
是解决不了
但是vcpkg似乎会让依赖到同一个baseline上,能缓解这种问题
然后也不需要用submodule这种方式了
--【拾贰】--:
原来是这个意思
其实别的语言也会有这个问题,但通常不会遇到,似乎都是直接暴力新版本覆盖掉旧
不过Cargo这个处理得还是有点意思的
--【拾叁】--:
不过要是都这么复杂了,可以考虑一下Rust,Rust的Cargo似乎是原生支持你这个行为的,那个就爽了,不用cpp这种野方案了

