II. 依赖
显式声明与隔离依赖
大部分编程语言提供一套分发支持库的打包系统, 比如Perl的CPAN或Ruby的Rubygems。从打包系统安装的二方库可以在系统层面(众所周知的“site packages”)或包含应用的目录区域(众所周知的“vendoring”或“bundling”)。
一个12因子应用决不依赖隐式的系统级包。它会声明所有依赖项,完整并精确地,通过依赖声明的清单。更进一步,它使用一种依赖隔离工具来保证执行期没有隐式的依赖被“泄露”到周围的系统。显式声明的依赖规范会被无差别的应用到开发环境与生产环境。
例如,Ruby的Gem Bundler提供Gemfile 文件格式作为依赖生命,bundle exec作为依赖隔离。Python有两个不同的工具来做这些步骤 — Pip用来声明作为隔离目的的Virtualenv。 就算是C也有为依赖声明的Autoconf,和提供依赖隔离的静态链接。不管什么工具链,依赖声明与隔离都必须一起使用— 只有一个或另一个不能满足12因子的需要。
一个显式声明依赖的好处是能简化开发人员对新应用的设置工作。新开发者可以从应用代码库检出代码到他们的开发机器,前置条件只是安装过语言的运行时及依赖管理器。他们可以用build命令设置好运行程序所需的所有东西。例如,Ruby/Bundler 的build命令是bundle install,Clojure/Leiningen的是lein deps。
12因子应用也不依赖任何隐式的其他系统工具的依赖。比如shell命令ImageMagick或curl。这些工具当然可能存在在许多或大部分系统中,但这并不保证他们会存在在所有系统或应用以后可能运行的系统,或以后的系统版本能否兼容现有版本的应用。如果应用需要使用外部的系统工具,这个工具需要被打包进应用里。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。