配置文件composer.json
Composer的配置文件为项目根目录下的composer.json文件,对第三方库的依赖就配置在此文件中:在require
或者require-dev
中填入相应的库的名称以及版本需求。1
2
3
4
5
6
7
8
9{
"require" : {
"php": ">5.3.0",
"curl/curl": ">=1.4.0"
},
"require-dev": {
"phpunit/phpunit": "*"
}
}
安装依赖库到本地
composer install
在composer.json文件所在目录执行composer install
, composer.json里填写的依赖包就会被下载到本地。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
170 composer-learn $ ls
composer.json
0 composer-learn $ composer install
Loading composer repositories with package information
Updating dependencies (including require-dev)
- Installing curl/curl (1.4.0)
Loading from cache
......
many package...
......
Writing lock file
Generating autoload files
0 composer-learn $ ls
composer.json composer.lock vendor/
0 composer-learn $ ls vendor/
autoload.php composer/ doctrine/ phpdocumentor/ phpunit/ symfony/
bin/ curl/ myclabs/ phpspec/ sebastian/ webmozart/
- 如果没有
composer.lock
文件的话,composer install
命令就会从composer.json
文件中读取依赖关系,并根据composer.json
中的配置生成composer.lock
文件。注意上面示例中输出的:Writing lock file - 如果当前目录中有
composer.lock
文件的话:composer install
命令将会从lock文件中读取对应的依赖信息;
composer update
如果新增或修改了composer.json
里的包的依赖信息,改怎么办呢?
- 删除
composer.lock
文件,重新执行composer install
命令,当然这看起来有点蠢。 - 执行
composer update
命令。composer update
会从composer.json
中重新获取依赖关系,并将新的信息更新到composer.lock
文件中。
require和require-dev的区别
通过操作你可以看到,文件中require
和require-dev
段的配置都会被安装到本地,那么require
和require-dev
有什么差异呢?
字面意义区别
require
: 代码中必须要用到的库。require-dev
: 开发环境需要,但在正式环境中不要的库。比如用于单元测试的phpunit/phpunit
。
Composer
是如何判断是否开发环境的?
Composer
本身是无法判断当前环境是正式环境还是开发环境的,需要我们通过参数的方式告诉composer到底需要什么方式的安装。
- 如我们所见,
require
和require-dev
段的配置默认都会被安装。在老版本的composer中,require-dev的配置默认是不会安装的,需要使用composer install --dev
的方式来安装require-dev
中的依赖包。 - 在生产环境机器上,我们不想安装phpunit等不需要的包,可以通过
composer install --no-dev
命令进行安装。如果已经安装了require-dev中的依赖包,执行此命令将会删除已安装的require-dev
的包。1
2
3
4
5
6
7
8
9
10
11
120 composer-learn $ ls
composer.json composer.lock vendor/
0 composer-learn $ composer install --no-dev
Loading composer repositories with package information
Installing dependencies from lock file
- Removing phpunit/phpunit (5.6.1)
- Removing myclabs/deep-copy (1.5.4)
...
- Removing symfony/yaml (v3.1.5)
Generating autoload files
0 composer-learn $ ls vendor/
autoload.php bin/ composer/ curl/
如何改变包安装的目录
第三方包默认安装到composer
所在目录下的vendor
文件夹下。如果想要改变依赖包的路径,可以通过修改配置vendor-dir
的值来更改。1
2
3
4
5
6
7
8
9
10
11
12{
"config": {
"vendor-dir": "folder/plugins"
},
"require" : {
"php": ">5.3.0",
"curl/curl": ">=1.4.0"
},
"require-dev": {
"phpunit/phpunit": "*"
}
}
执行安装命令进行测试:1
2
3
4
5
6
7
8
9
10
11
12
13
140 composer-learn $ ls
composer.json
0 composer-learn $ composer install --no-dev
Loading composer repositories with package information
Updating dependencies
- Installing curl/curl (1.4.0)
Loading from cache
Writing lock file
Generating autoload files
0 composer-learn $ ls
3rdParty/ composer.json composer.lock
0 composer-learn $ ls 3rdParty/vendor/
autoload.php composer/ curl/
依赖包的版本
版本约束可以通过以下几种方法指定。
名称 | 示例 | 描述 |
---|---|---|
确切的版本号 | 1.0.2 |
你可以指定包的确切版本。 |
范围 | >=1.0 >=1.0,<2.0 >=1.0,<1.1 |="">=1.21.1> |
通过使用比较操作符可以指定有效的版本范围。 有效的运算符:>、>=、<、<=、!=。 你可以定义多个范围,用逗号隔开,这将被视为一个逻辑AND处理。 一个管道符号|将作为逻辑OR处理。 AND 的优先级高于 OR。 |
通配符 | 1.0.* |
你可以使用通配符来指定一种模式。1.0.与>=1.0,<1.1是等效的。 |
赋值运算符 | ~1.2 |
这对于遵循语义化版本号的项目非常有用。~1.2相当于>=1.2,<2.0。 |
下一个重要版本(波浪号~
运算符)
~
最好用例子来解释: ~1.2
相当于 >=1.2,<2.0
,而 ~1.2.3
相当于 >=1.2.3,<1.3
。正如你所看到的这对于遵循语义化版本号的项目最有用。一个常见的用法是标记你所依赖的最低版本,像 ~1.2
(允许1.2以上的任何版本,但不包括2.0)。由于理论上直到2.0应该都没有向后兼容性问题,所以效果很好。你还会看到它的另一种用法,使用~
指定最低版本,但允许版本号的最后一位数字上升。
注意: 虽然
2.0-beta.1
严格地说是早于2.0
,但是,根据版本约束条件, 例如~1.2
却不会安装这个版本。就像前面所讲的~1.2
只意味着.2
部分可以改变,但是1.
部分是固定的。
稳定性
默认情况下只有稳定的发行版才会被考虑在内。如果你也想获得 RC、beta、alpha 或 dev 版本,你可以使用 稳定标志。你可以对所有的包做最小稳定性(minimum-stability)设置,而不是每个依赖逐一设置。
minimum-stability (root-only)
这定义了通过稳定性过滤包的默认行为。默认为 stable(稳定)。因此如果你依赖于一个 dev(开发)包,你应该明确的进行定义。
对每个包的所有版本都会进行稳定性检查,而低于 minimum-stability 所设定的最低稳定性的版本,将在解决依赖关系时被忽略。对于个别包的特殊稳定性要求,可以在 require 或 require-dev 中设定(见上文说明)。
可用的稳定性标识(按字母排序):dev
、alpha
、beta
、RC
、stable
。