看到一篇文章不错:

http://harttle.com/2015/05/29/pkg-manager.html

包管理和构建系统是现代的软件开发团队中必不可少的工具,也是Linux软件系统的常见组织方式。 现代编程语言大多给出了自己专用的包管理和构建系统,那么本文便来总结一下小编用过的那些包管理和构建系统。

JavaScript

服务器端 Javascript 通常使用NPM作为依赖管理工具。

  • 通过NPM提供的npm命令来进行依赖的下载、升级和移除。
  • 通过package.json来定义软件包的元信息、开发依赖(开发或测试需要)、部署依赖(运行时需要)。
  • 依赖递归地存储在node_modules中。
  • 依赖在项目之间是隔离的,全局安装(-g)会使它成为命令行工具而不是全局依赖。 > 递归的依赖下载风格使得NPM的缓存及其重要。缓存位于~/.npm下,这里保存这.tgz格式的包文件。

JavaScript 通常使用 Grunt 进行构建。

  • Grunt通过插件来完成任务,每个插件相当于Makefile的一个命令。
  • Grunt任务定义在Gruntfile.js中。
  • NPM提供了众多的Grunt插件,当然你也可以手写。
  • Grunt任务继承了JavaScript的异步特性。

前端 lib

前端 lib 可以通过 Bower 来下载。Bower 不仅可以下载已注册的软件包,还可以下载Github Repo,甚至是一个文件的URL。

  • 通过bower命令进行依赖管理。
  • bower.json定义了软件包的元信息与依赖。
  • 依赖所在路径可以在bower.json中进行设置。
  • Bower只是一个命令行工具,你需要在正确的路径执行Bower命令。

Bower可以灵活地下载各种依赖,但它的缺点也是明显的:未注册的软件包往往包含冗余的非生产环境的代码,有时甚至需要手动构建。

Java

Maven是基于项目对象模型(POM)的项目管理工具,通过文本文件来描述项目的版本、URL、License、依赖等信息。

  • 通过pom.xml来描述Maven项目。
  • Maven是项目管理工具,其功能包括依赖管理、软件构建。
  • Maven通过.properties文件和命令行参数读取系统特性。

Ant是由Java写成的编译、测试和部署Java应用的命令行工具。

  • 通过build.xml来描述构建过程。
  • build.xml的逻辑类似Makefile,每个target由命令和参数构成。
  • 通过命令行参数来读取系统特性。

Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具。它使用一种基于Groovy的特定领域语言来声明项目设置,而不是传统的XML。

Python

Python的包管理工具能讲一整天的故事:distribute、setuptools、distutils、easy_install、pip、distutils2、packaging、eggs、wheels、pyvenv、virtualenv……

这也是我为什么讨厌安装python软件的原因,与此同时,旧版本的python2比新的python3更加流行以及两者不兼容也常常给Linux包管理造成麻烦。

现在开始讲故事:

  1. distutils是python的标准库;
  2. setuptools试图完成distutils缺少的特性而开始开发;
  3. easy_install是setuptools的命令行接口,有更多的特性;
  4. 在setuptools的开发过程中产生了分歧,于是出现了distribute,它fork自setuptools,并在2013年取得和解并重新merge到setuptools 0.7版本;
  5. 相比于上述工具,pip是一个更加高阶的接口,pip成为事实上的python软件的安装工具;
  6. eggs和wheels成为事实上的二进制python软件的安装工具。

venvvirtualenv则是用来创建python虚拟环境来实现应用隔离的。

  • venv在python3.3中引入,用于在自己的目录下创建轻量级的虚拟环境,也可以孤立于系统环境。
  • virtualenv则是一个python软件包,用于创建孤立的python环境。

Ruby

Ruby的软件包单元为RubyGem

  • Gem由.gemspec文件描述。
  • Gem的构建过程由Rakefile描述。
  • Rake是Gem的构建工具,它与Make类似,用以完成自动化测试和代码生成。
  • Bundle则是Ruby的包管理工具,用来跟踪和下载正确版本的Gem。
Perl
  用的是CPAN www.cpan.org/
 
PHP
  貌似是composor,但是好像也用的不多。是否因为PHP是拷贝就行?所见即所得。
 
C++
  好像有个CPM,但是基本没有人用。http://www.cpm.rocks/
 
其他:
  Mac用Brew, Ubuntu用apt-get,CentOS用yum
 
关于C++中为什么没有好的通用的包管理框架,下面这篇分析挺好:
Miller Nether 新版知乎客户端不错
44 人赞同
此问题相当有价值,我认为我会持续更新。已经将不严谨的“二进制”和“源代码”更换为更为严谨的描述"as is"和"source"。 我欢迎各类程序员和我一起探讨这个问题。 先说结论:c/c++和其他语言不同,要管理c/c++的包,你需要管理的不是"as is",而是"source"。写程序的人需要的包管理器,和管理系统的人需要的包管理器是不一样的。 npm/apt/yum之类的包管理器的特点主要是"as is",也就是下载下来就可以用。这样子对于C++来说是非常非常难以做到的,比如: 1. Windows下的MT/MTd/MD/MDd我无法解决。换言之,如果要通用,Windows 32bit就要至少提供四套binary。更加烦的是从Visual Studio 2012开始还需要指定XP兼容性。此外Debug Info指向的cpp文件是绝对路径,也就是换个电脑你只能手动指定源文件的位置。 2. Linux下的binary也有区别,举个例子,有RTTI和没有RTTI的代码是没法链接在一起的。 如果我需要要做到"as is",我不单单需要为不同的系统、配置提供不同的binary,还需要为一些编译选项提供不同的binary。于是一个版本,我将提供几乎数不清的binary,因为不同的配置、系统、编译选项之间还可以做笛卡尔积。更何况,只有binary并不能调试,Debug Info通常占用的空间会比binary更加巨大,常常可以做到几个G,单单是压缩这些Debug Info就会耗费几十分钟的时间,对于包发布者来说,是个巨大的压力。 此外,C++由于其复杂的历史原因,造成了复杂的依赖项,有的依赖perl,有的依赖于python,。这些项目的历史悠久,有无数数不清的坑。想要做到"Modern",不是不想,而是实在是做不到。比如LLVM和Clang,已经算是这些项目中非常优秀的项目了,历史包袱也不是非常多,代码非常优秀,模块化,可是做了不知道多久还没有彻底从Autotools迁移到CMake。这些复杂的依赖项是没有办法说直接"as is"使用的,因为他们的目录的位置并不是遵循一个统一的标准,如果说有一个统一的标准,那么C++的包管理器会好做很多。 同样的问题,出现在同样历史悠久的PHP身上。PHP本身有非常多的坑,这个就不细说了,而Composer花费了近10年时间才逐渐将PHP变成了现在这个Modern的样子(当然还有PHP自己的努力)。 有C++包管理器尝试说要求每个添加进库的项目都必须是符合规定的,例如,比如使用CMake。很不幸,目前C++领域最多人用的包管理器是这个思路。CMake非常优秀,然而正如我上面所说。但逐一纠正每个包,几乎是不可能的。我认为更实际的做法是,为每个包写一个编译配置,只需要编译好的头文件和二进制符合规范即可。我们必须要兼顾到C/C++悠久的历史所导致的无数的编译环境,例如autotools, CMake, gyp, ninjia。 最近很火的Rust的包管理器Cargo,所使用的方法,如我所使用的一样,是将源代码包"as is"下载下来,在编译的时候,优先编译dependencies。我认为这是比较符合实际的做法,它避免了我所上面列举的一些问题: 1. Binary的规则太细并不互相兼容:重新编译可以保证编译选项是兼容的。
2. 所依赖的包太多历史包袱,无法兼容新的标准:即时编译以后将编译好的二进制和文件按照统一的规范存储到新的位置。 Rust的Cargo的一个问题是要求必须使用Rust的脚本编译,而不是Shell。这样子对于我们来说也许是坏消息。但对于Rust来说,可以避免其仓库被海量的C++代码库湮灭,也许是幸运。 就算是如我上面所说,还会有一些新的问题: 1. 编译的时间太久:于是可以使用缓存的方法,将一个依赖项的某一个配置缓存起来。这对于其他语言来说可能不是刚需,但对于C++来说,简直太需要了。
2. 为每个包写符合规范的配置选项,仍然会是一个很大的工作量。这一点我相信靠我们的努力,未来会做得更好。

[Todo]各种语言包管理工具的更多相关文章

  1. Go语言包管理工具Glide

      Go语言包管理工具用于管理Go项目的库和库的依赖引用. 包管理工具普遍会在Go项目根目录生成Vendor文件夹并自动下载该Go项目需要的库. Go语言有很多开源的包管理工具,这里主要介绍Glide ...

  2. Go语言包管理工具dep

    什么是dep? dep和go,在一定程度上相当于maven之于Java,composer之于PHP,dep是go语言官方的一个包管理工具. 相比较go get而言,dep可以直接给引入的第三方包一个专 ...

  3. Python黑帽编程1.3 Python运行时与包管理工具

    Python黑帽编程1.3  Python运行时与包管理工具 0.1  本系列教程说明 本系列教程,采用的大纲母本为<Understanding Network Hacks Attack and ...

  4. 编码神器——Sublime Text 包管理工具及扩展大全

    Sublime Text 是程序员们公认的编码神奇,拥有漂亮的用户界面和强大的功能,例如代码缩略图,多重选择,快捷命令等.还可自定义键绑定,菜单和工具栏.Sublime Text 的主要功能包括:拼写 ...

  5. NodeJS包管理工具——npm入门

    如今每个语言体系中都有一个包管理工具,PHP的Composer,Ruby的gem,Python的pip,Java的Maven……当然还有Node.js的npm.有的人会奇怪为何要引入又一个新东西来让我 ...

  6. 编码神器 Sublime Text 包管理工具及扩展大全

    Sublime Text 是程序员们公认的编码神奇,拥有漂亮的用户界面和强大的功能,例如代码缩略图,多重选择,快捷命令等.还可自定义键绑定,菜单和工具栏.Sublime Text 的主要功能包括:拼写 ...

  7. Python包管理工具和多版本环境管理

    1. Python包管理工具 在安装Python包的过程中,经常涉及到distutils.setuptools.distribute.setup.py.easy_install.easy_instal ...

  8. Helm包管理工具(简介、安装、方法)

    认识Helm 每次我们要部署一个应用都需要写一个配置清单(维护一套yaml文件),但是每个环境又不一样.部署一套新的环境成本是真的很高.如果我们能够使用类似于yum的工具来安装我们的应用的话那就太好了 ...

  9. Anaconda 包管理工具 conda 进行虚拟环境管理入门

    在基于 python 进行数据分析.机器学习等领域的实践和学习时,由于代码的更迭和更新,运行他人实现的代码或尝试安装新的工具库时往往需要指定特定版本的其他工具库,以满足特定环境的构建条件.而将同一工具 ...

随机推荐

  1. MyBatis3-与Spring 4集成

    继续使用前一篇的例子http://www.cnblogs.com/EasonJim/p/7052368.html,实际项目中,通常会用Spring来管理DataSource等.充分利用Spring基于 ...

  2. [设计模式-行为型]模板方法模式(Template Method)

    一句话 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. 概括

  3. Pygame-依葫芦画瓢之兔獾大战

    Pygame-依葫芦画瓢之兔獾大战 前几天看到国外一个12岁的孩子写的兔獾大战游戏,心生敬佩,想当年我还是12岁的时候还不知电脑为何物,连小霸王都未曾玩过.自己也未曾想去搞游戏开发,纯属自娱自乐.在此 ...

  4. 【JBPM4】完成任务

    示例代码: ProcessEngine processEngine = Configuration.getProcessEngine(); TaskService taskService = proc ...

  5. hdu 4135 Co-prime (素数打表+容斥原理)

    题目链接 题意:问从A到B中与N互素的个数. 题解: 利用容斥原理:先求出与n互为素数的个数. 可以先将 n 进行素因子分解,然后用区间 x 除以 素因子,就得到了与 n 的 约数是那个素因子的个数, ...

  6. Codeforces 1131 A. Sea Battle-暴力 (Codeforces Round #541 (Div. 2))

    A. Sea Battle time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  7. 使用supervisor管理后台进程

    在linux中supervisor是用来管理后台进程的,是一个用python写的进程管理工具,可以让宕机的进程重启.这里我们大概讲一下用他来管理uWSGI. 一.安装supervisor 1.pyth ...

  8. 洛谷——P1869 愚蠢的组合数

    P1869 愚蠢的组合数 题目描述 最近老师教了狗狗怎么算组合数,狗狗又想到了一个问题... 狗狗定义C(N,K)表示从N个元素中不重复地选取K个元素的方案数. 狗狗想知道的是C(N,K)的奇偶性. ...

  9. Sqli-labs介绍、下载、安装

    SQLI和sqli-labs介绍 SQLI,sql injection,我们称之为sql注入.何为sql,英文:Structured Query Language,叫做结构化查询语言.常见的结构化数据 ...

  10. 子查询在UPDATE 语句中的应用

    在UPDATE语句中可以在更新列表中以及WHERE语句使用子查询.下面演示一个将图书的出版日期全部更新为所有图书中的最新出版日期,SQL语句如下: UPDATE T_Book SET FYearPub ...