包管理和构建系统是现代的软件开发团队中必不可少的工具,也是 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 包管理造成麻烦。
现在开始讲故事:
- distutils 是 python 的标准库;
- setuptools 试图完成 distutils 缺少的特性而开始开发;
- easy_install 是 setuptools 的命令行接口,有更多的特性;
- 在 setuptools 的开发过程中产生了分歧,于是出现了 distribute,它 fork 自 setuptools,并在 2013 年取得和解并重新 merge 到 setuptools 0.7 版本;
- 相比于上述工具,pip 是一个更加高阶的接口,pip 成为事实上的 python 软件的安装工具;
- eggs 和 wheels 成为事实上的二进制 python 软件的安装工具。
venv
和 virtualenv
则是用来创建 python 虚拟环境来实现应用隔离的。
- venv 在 python3.3 中引入,用于在自己的目录下创建轻量级的虚拟环境,也可以孤立于系统环境。
- virtualenv 则是一个 python 软件包,用于创建孤立的 python 环境。
Ruby
Ruby 的软件包单元为 RubyGem。