Ben*_*ley 46 c++ package-managers
我最喜欢的语言之一是我最大的挫折之一就是在一个统一的开发环境下让不同的库一起工作所需的努力.我最大的愿望是能够告诉我的IDE,或者其他什么,我需要一个特定的库,它负责下载它,编译它(如果需要),安装它,然后设置包含和库路径.
我想要的是这个,但是对于C++.我更喜欢它是否适用于Visual Studio,但gcc也可以.或者,如果它是它自己的独立系统,那也没关系.但是,它确实必须在Windows中运行.
哪些有前途的项目可以解决这个问题?
nur*_*tin 17
你认为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 ..
Run Code Online (Sandbox Code Playgroud)
要选择特定的依赖版本,
cd package && git checkout v3.2 && cd .. && git add package/
git commit -am "package version 3.2 pinned" && git push
Run Code Online (Sandbox Code Playgroud)
现在,您已将包依赖项固定到特定标记,并将设置保存到项目存储库中.下次有人这样做:
git pull && git submodule update
Run Code Online (Sandbox Code Playgroud)
他们的包依赖性也将固定到v3.2.
某些包管理系统还具有签名包.Git允许您通过GPG签署您的标签,并让人们通过将您的公钥添加到其密钥环来验证它.
所以我们有包下载,依赖版本,我们可以模拟"包签名".一个缺失的部分是预建的二进制文件,在我看来并不是绝对必要的.另一个缺失的部分是全球包管理.当依赖关系的依赖关系得到更新时,您必须手动管理每个git存储库.
Spe*_*ing 12
答案是使用Conda进行打包/依赖管理以及您喜欢用于构建的任何工具(我使用CMake).
看看这里:
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节点上工作.Python有一个笑话(现在已超过10年).通过使用Conda,我绕过了这种痛苦,并且能够在我想要的任何版本的Python上工作而不会影响其他任何人.
6)环境可以压缩成"安装程序"进行分发.
7)您可以在专有库的防火墙后面维护自己的私有存储库.公共集中式存储库称为Binstar.您的依赖关系可以来自(或两者).
许多人错误地认为Conda是一个仅限Python的系统,但实际上Conda是为原生包装而创建的(它与语言无关).它有巨大的Python存在,仅仅因为它最初的动机是克服Python的其他打包系统(pip + pypi)中可怕的本机库支持.
Conda目前唯一的问题是Binstar(中央存储库)还没有包.你肯定会遇到你想要的遗失库 - 但这很容易解决:你可以自己构建你喜欢的任何软件包并将其推送到Binstar.我必须为数十个本地库执行此操作.它运作得很好.
在开发C++代码时,我永远不会回到系统依赖管理器.
从NuGet 2.5开始,NuGet支持本机项目.但是,手工制作包非常复杂,所以他们建议使用CoApp的Powershell工具来获取NuGet(这里有文档).使用这些工具,您现在可以在NuGet上托管您的C/C++包.
这不太可能发生,因为不同的C++库通常使用VASTLY不同的构建系统.例如,Autoconf,scons,make,MSBuild,VCBuild,Boost Jam,CMake,NMake和QMake.此外,许多C和C++开发人员使用Yacc和Bison等工具生成代码.
Maven和NuGet以他们的方式工作,因为他们支持生态系统(构建工具的变化相对较小).在Maven的案例中是Ant,在NuGet案例中是MSBuild.构建一个类似的系统来处理正在使用的大量C++构建系统是不可行的,也是不切实际的(考虑到对这类系统的需求似乎不足).