有没有努力为C ++创build一个包pipe理器?
用我最喜欢的语言来说,我最大的挫折之一就是在一个统一的开发环境下让不同的库一起工作。 我最大的愿望是能够告诉我的IDE,或者其他什么,我需要一个特定的库,它需要照顾下载,编译(如果需要),安装它,然后设置包含和库path。
我想要的是这个 ,但对于C ++。 我更喜欢它是否适用于Visual Studio,但gcc也可以。 或者如果它是自己独立的系统,那也没关系。 但是,它必须在Windows中工作。
有什么有前途的项目可以解决这个问题?
如果你正在使用MinGW,那么已经有一个类似于apt-get / aptitude的包pipe理器,它可以做你想做的事情: mingw-get
它的行为类似于Debian的apt-get / aptitude。 在已包含的软件包中,您可以findexpat,libxml2,zlib,pthread等。
很明显,你需要一个MinGW的副本来开始使用它。
你认为Git是一个包pipe理器吗? 我一直在使用git子模块进行依赖关系和子依赖关系,并结合免费的git托pipe服务,这个想法是相当强大的。
只要进入你的git项目,
git submodule add git://somehosting.com/you/package.git git submodule init package git submodule update package cd package && ./configure --stuff && make && cd ..
要select特定的依赖版本,
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。
一些包pipe理系统还具有签名包。 Git允许您对您的标签进行GPG签名,并让人们通过将您的公钥添加到他们的钥匙圈来进行validation。
所以我们有包下载,依赖版本,我们可以模拟“包签名”。 一个缺失的部分是预先构build的二进制文件,在我看来,这不是绝对必要的。 另一个缺失的部分是全球包pipe理。 当依赖关系的依赖性得到更新时,您将不得不手动pipe理每个git存储库。
从NuGet 2.5开始, NuGet支持本地项目 。 然而,手工制作包非常复杂,所以他们build议使用CoApp的NuGet Powershell工具( 文档在这里 )。 使用这些工具,您现在可以在NuGet上托pipe您的C / C ++包。
答案是使用Conda进行打包/依赖pipe理以及任何你喜欢的工具(我使用CMake)。
看看这里:
Conda类似于apt-get,yum,nuget等软件包pipe理器,但有几个重要的优点:
1)完全跨平台(目前Linux,Windows和OSX,但其他平台可以轻松添加)
2)不需要root权限来使用。 实际上,根本不关心你的系统包。 这与在你的homedir中构build一个完整的堆栈(如果你愿意的话)是相似的,除非有人已经为你构build了它们。 这个魔法是通过使包可重新定位来实现的。
3)你可以保持尽可能多的不同的环境,你想并排。 你的一个应用程序是否需要python 2.7.6,但是另一个需要python 2.7.4吗? 没问题 – 他们可以和平共存
4)你不会再被迫为各种Linux发行版维护单独的版本。 一个适当的Conda环境将适用于其中任何一个。 别忘了其他平台(例如Windows和OSX)!
5)您不再与系统或IT部门为您决定的图书馆版本结婚。 例如,我被迫在RHEL5节点上工作。 Python有一个笑话(现在已经超过10年了)。 通过使用Conda,我避开了这个痛苦,并且能够在不影响其他任何人的情况下工作在我想要的任何版本的Python上。
6)环境可以压缩到“安装者”进行分发。
7)你可以维护你自己的私有存储库在你的防火墙后面的专有库。 公共集中式存储库被称为Binstar。 你的依赖可以来自任何一个(或两者)。
许多人错误地认为康达是一个纯Python系统,但实际上Conda是为本地打包(这是语言不可知的)而创build的。 它拥有巨大的Python存在,仅仅是因为它的原始动机是克服了Python其他封装系统(pip + pypi)中可怕的本地库支持。
目前Conda唯一的问题是,Binstar(中央存储库)还没有包装。 你肯定会遇到你想要的缺less的库 – 但是这很容易解决:你可以build立你喜欢的任何包,并推送到Binstar。 我必须为几十个本地图书馆这样做。 它工作得很好。
在开发C ++代码时,我永远不会回到系统依赖pipe理器。
这不太可能发生,因为不同的C ++库经常使用VASTLY不同的构build系统。 Autoconf,scons,make,MSBuild,VCBuild,Boost Jam,CMake,NMake和QMake就是例子。 此外,很多C和C ++开发人员使用Yacc和Bison等工具生成代码。
Maven和NuGet以他们的方式工作,因为他们支持生态系统在构build工具上有相对较less的变化。 ant在Maven的情况下,MSBuild在NuGet的情况下。 build立一个类似的系统来与大量的C ++构build系统一起使用将是不可行和不切实际的(因为对这样的系统似乎缺乏需求)。
有Daveed的模块build议 ,它没有把它变成C ++ 0x。
我一直在研究跨平台和跨架构的分布式包pipe理器 。 所有的软件包都安装在项目目录中(有点像nodejs的工作原理)。 这是一项正在进行的工作。
CoApp似乎有微软的支持。
ryppl似乎正在做你所要求的更多,跨平台:
我们的使命是为便携式模块化C ++软件生态系统创造条件
已经在GitHub上出现: https : //github.com/ryppl/ryppl