有没有努力为c++创建一个包管理器?
Are there any efforts to create a package manager for C++?
对于我最喜欢的语言,我最大的挫折之一是要在一个统一的开发环境下让不同的库一起工作。我最大的愿望是能够告诉我的IDE,或者其他什么,我需要一个特定的库,它负责下载它,编译它(如果需要),安装它,然后设置包含和库路径。
我想要的是这个,但是对于c++。我更希望它能与Visual Studio一起工作,但gcc也可以。或者如果它是它自己独立的系统,那也可以。但是,它必须在Windows上运行。
有哪些有前途的项目可以解决这个问题?
您考虑过Git作为包管理器吗?我一直在使用git子模块来处理依赖项和子依赖项,并结合免费的git托管服务,这个想法非常强大。
进入git项目,
git submodule add git://somehosting.com/you/package.git
git submodule init package
git submodule update package
cd package && ./configure --stuff && make && cd ..
选择特定的依赖版本,
cd package && git checkout v3.2 && cd .. && git add package/
git commit -am "package version 3.2 pinned" && git push
现在您已经将您的包依赖关系固定到一个特定的标签,并将您的设置保存到您的项目存储库。下次有人这么做:
git pull && git submodule update
它们的包依赖也将固定到v3.2。
一些包管理系统还具有签名包的特性。Git允许您对标签进行GPG签名,并允许人们通过将您的公钥添加到他们的密匙环中来验证它。
所以我们有包下载,依赖版本,我们可以模拟"包签名"。一个缺失的部分是预构建的二进制文件,在我看来,这不是绝对必要的。另一个缺失的部分是全局包管理。当一个依赖项的一个依赖项更新时,你必须手动管理每个git存储库。
答案是使用Conda来打包/依赖管理和任何你喜欢的工具来构建(我使用CMake)。
点击这里查看:
http://conda.pydata.org/Conda类似于apt-get、yum、nuget等包管理器,但有几个重要的优点:
1)完全跨平台(目前是Linux、Windows和OSX,但其他平台也可以轻松添加)
2)不需要root权限使用。实际上,它根本不关心您的系统包。它类似于在您的homedir中构建整个堆栈(如果您愿意,可以降低到libc),只不过已经有人为您构建了它们。这个魔法是通过使包可重定位实现的。
3)你可以同时维护尽可能多的不同环境。是否一个应用程序需要python 2.7.6,而另一个应用程序需要python 2.7.4?没问题,他们可以和平共处
4)您将再也不会被迫为不同的Linux发行版维护单独的构建。一个适当构造的Conda环境将适用于其中的任何一个。不要忘记其他平台(如Windows和OSX)!
5)您不再使用由系统或IT部门为您决定的库版本。例如,我被迫在RHEL5节点上工作。那里的蟒蛇是一个笑话(现在超过10年了)。通过使用Conda,我绕过了这种痛苦,并且能够在我想要的任何版本的Python上工作,而不会影响到其他人。
6)环境可以压缩成"安装程序"进行分发。
7)你可以在防火墙后维护你自己的私有库。公共集中式存储库称为Binstar。您的依赖项可以来自其中之一(或两者都有)。
许多人错误地认为Conda是一个只支持python的系统,但实际上Conda是为本地打包而创建的(它与语言无关)。它在Python中占有巨大的地位,仅仅是因为它最初的动机是为了克服Python的其他打包系统(pip + pypi)中糟糕的本地库支持。
Conda目前唯一的问题是Binstar(中央存储库)还没有包含每个包。您肯定会遇到缺少所需库的情况——但这很容易修复:您可以自己构建任何喜欢的包并将其推送到Binstar。我已经为几十个本机库做过这样的工作。它工作得很好。
在开发c++代码时,我永远不会回到系统依赖管理器。
这种情况不太可能发生,因为不同的c++库通常使用截然不同的构建系统。Autoconf, scons, make, MSBuild, VCBuild, Boost Jam, CMake, NMake和QMake都是例子。此外,许多C和c++开发人员使用Yacc和Bison等工具生成代码。
Maven和NuGet的工作方式,因为他们支持生态系统(相对)很少变化的构建工具。Maven的例子是Ant, NuGet的例子是MSBuild。构建一个类似的系统来处理大量正在使用的c++构建系统是不可行和不切实际的(考虑到似乎缺乏对此类系统的需求)。
从NuGet 2.5开始,NuGet支持本地项目。然而,手工制作这个包非常复杂,所以他们建议使用CoApp的Powershell Tools for NuGet(文档在这里)。使用这些工具,您现在可以在NuGet上托管C/c++包。
如果您正在使用MinGW,那么已经有一个类似apt-get/aptitude的包管理器可以满足您的要求:MinGW -get
它的行为类似于Debian的apt-get/aptitude。在已经包含的包中,您可以找到expat, libxml2, zlib, pthread等。
显然,您将需要一个MinGW的副本来开始使用它。
我一直在开发一个跨平台、跨架构的分布式包管理器。所有包都安装在项目目录中(有点像nodejs的工作方式)。这是一项正在进行的工作。
ryppl似乎正在做您所需要的更多,跨平台:
我们的使命[是]为一个可移植的、模块化的c++软件生态系统创造条件
已经在GitHub上加了星:https://github.com/ryppl/ryppl
有戴维的模块建议,它没有进入c++ 0x。
CoApp似乎得到了微软的支持。
- 如何维护资源管理器项目视图中当前可见的项目列表
- 使用"Task"函数指针队列定义作业管理器
- 全局变量 多读取器 一个写入器多线程安全?
- 实现动态插件管理器
- 编译器资源管理器和 GCC 具有不同的输出
- Windows 资源管理器中的图标在使用 resource.rc 时显示 2 个不同的图标
- C++ 事件管理器的回调,使用 std::function 和 std:bind 以及派生类作为参数
- Linux 包管理器如何处理 C++20 个模块?
- 编译器资源管理器(godbolt)如何安全地运行代码?
- 创建跨平台 C++ 触摸管理器.在 c++ 中传递 Objective-c 对象涉及代码
- 从 GUI 文件资源管理器执行程序,并且不生成终端
- 自定义内存管理器在发布模式下工作正常,但在调试模式下则不然
- 无法删除EXE崩溃后,即使进程未显示在任务管理器中
- 任务管理器 - C/C++ 应用程序 - 分配的地址空间与已用内存
- 如何以编程方式获取任务管理器进程CPU使用率(不是PerfMon API)
- IDE,框架,代码管理器工具,在一个项目中支持Java和C++的东西
- 恢复能力为一个简单的下载管理器(C++-WinInet)
- 方法使用文件管理器创建一个空目录
- 用管理器注册一个类,然后调用子类被覆盖的方法
- 有没有努力为c++创建一个包管理器?