PHPer 需要了解的 5 个 Composer 小技巧


Posted in PHP onAugust 18, 2014

Composer是新一代的PHP依赖管理工具。其介绍和基本用法可以看这篇《PHP管理依赖(dependency)关系工具 Composer 安装与使用》。本文介绍使用Composer的五个小技巧,希望能给你的PHP开发带来方便。

1. 仅更新单个库

只想更新某个特定的库,不想更新它的所有依赖,很简单:

composer update foo/bar

此外,这个技巧还可以用来解决“警告信息问题”。你一定见过这样的警告信息:

Warning: The lock file is not up to date with the latest changes in composer.json, you may be getting outdated dependencies, run update to update them.

擦,哪里出问题了?别惊慌!如果你编辑了composer.json,你应该会看到这样的信息。比如,如果你增加或更新了细节信息,比如库的描述、作者、更多参数,甚至仅仅增加了一个空格,都会改变文件的md5sum。然后Composer就会警告你哈希值和composer.lock中记载的不同。

那么我们该怎么办呢?update命令可以更新lock文件,但是如果仅仅增加了一些描述,应该是不打算更新任何库。这种情况下,只需update nothing:

$ composer update nothing
Loading composer repositories with package information
Updating dependencies
Nothing to install or update
Writing lock file
Generating autoload files

这样一来,Composer不会更新库,但是会更新composer.lock。注意nothing并不是update命令的关键字。只是没有nothing 这个包导致的结果。如果你输入foobar,结果也一样。

如果你用的Composer版本足够新,那么你可以直接使用--lock选项:

composer update --lock

2. 不编辑composer.json的情况下安装库

你可能会觉得每安装一个库都需要修改composer.json太麻烦,那么你可以直接使用require命令。

composer require "foo/bar:1.0.0"

这个方法也可以用来快速地新开一个项目。init命令有--require选项,可以自动编写composer.json:(注意我们使用-n,这样就不用回答问题)

$ composer init --require=foo/bar:1.0.0 -n
$ cat composer.json
{
  "require": {
    "foo/bar": "1.0.0"
  }
}

3. 派生很容易

初始化的时候,你试过create-project命令么?

composer create-project doctrine/orm path 2.2.0

这会自动克隆仓库,并检出指定的版本。克隆库的时候用这个命令很方便,不需要搜寻原始的URI了。

4. 考虑缓存,dist包优先

最近一年以来的Composer会自动存档你下载的dist包。默认设置下,dist包用于加了tag的版本,例如"symfony/symfony": "v2.1.4",或者是通配符或版本区间,"2.1.*"或">=2.2,<2.3-dev"(如果你使用stable作为你的minimum-stability。

dist包也可以用于诸如dev-master之类的分支,Github允许你下载某个git引用的压缩包。为了强制使用压缩包,而不是克隆源代码,你可以使用install和update的--prefer-dist选项。

下面是一个例子(我使用了--profile选项来显示执行时间):

$ composer init --require="twig/twig:1.*" -n --profile
Memory usage: 3.94MB (peak: 4.08MB), time: 0s

$ composer install --profile
Loading composer repositories with package information
Installing dependencies
 - Installing twig/twig (v1.12.2)
  Downloading: 100%

Writing lock file
Generating autoload files
Memory usage: 10.13MB (peak: 12.65MB), time: 4.71s

$ rm -rf vendor

$ composer install --profile
Loading composer repositories with package information
Installing dependencies from lock file
 - Installing twig/twig (v1.12.2)
  Loading from cache

Generating autoload files
Memory usage: 4.96MB (peak: 5.57MB), time: 0.45s

这里,twig/twig:1.12.2的压缩包被保存在~/.composer/cache/files/twig/twig/1.12.2.0-v1.12.2.zip。重新安装包时直接使用。

5. 考虑修改,源代码优先

当你需要修改库的时候,克隆源代码就比下载包方便了。你可以使用--prefer-source来强制选择克隆源代码。

composer update symfony/yaml --prefer-source

接下来你可以修改文件:

composer status -v
You have changes in the following dependencies:
/path/to/app/vendor/symfony/yaml/Symfony/Component/Yaml:
  M Dumper.php

当你试图更新一个修改过的库的时候,Composer会提醒你,询问是否放弃修改:

$ composer update
Loading composer repositories with package information
Updating dependencies
 - Updating symfony/symfony v2.2.0 (v2.2.0- => v2.2.0)
  The package has modified files:
  M Dumper.php
  Discard changes [y,n,v,s,?]?

为生产环境作准备

最后提醒一下,在部署代码到生产环境的时候,别忘了优化一下自动加载:

composer dump-autoload --optimize

安装包的时候可以同样使用--optimize-autoloader。不加这一选项,你可能会发现20%到25%的性能损失。

如果你需要帮助,或者想要了解某个命令的细节,你可以阅读官方文档,或者查看JoliCode做的这个交互式备忘单。

PHP 相关文章推荐
如何分别全角和半角以避免乱码
Oct 09 PHP
php面向对象全攻略 (十二) 抽象方法和抽象类
Sep 30 PHP
php生成图形(Libchart)实例
Nov 06 PHP
PHP 正则判断中文UTF-8或GBK的思路及具体实现
Nov 26 PHP
php强制文件下载而非在浏览器打开的自定义函数分享
May 08 PHP
php用户注册时常用的检验函数实例总结
Dec 22 PHP
php封装的mysqli类完整实例
Oct 18 PHP
php爬取天猫和淘宝商品数据
Feb 23 PHP
Laravel5.7 数据库操作迁移的实现方法
Apr 12 PHP
php+js实现的无刷新下载文件功能示例
Aug 23 PHP
php自动加载代码实例详解
Feb 26 PHP
浅谈如何提高PHP代码质量之单元测试
May 28 PHP
PHP管理依赖(dependency)关系工具 Composer的自动加载(autoload)
Aug 18 #PHP
PHP实现取得HTTP请求的原文
Aug 18 #PHP
PHP管理依赖(dependency)关系工具 Composer 安装与使用
Aug 18 #PHP
PHP中使用asort进行中文排序失效的问题处理
Aug 18 #PHP
PHP中的排序函数sort、asort、rsort、krsort、ksort区别分析
Aug 18 #PHP
PHP命名空间(namespace)的动态访问及使用技巧
Aug 18 #PHP
PHP命名空间(namespace)的使用基础及示例
Aug 18 #PHP
You might like
用php实现像JSP,ASP里Application那样的全局变量
2007/01/12 PHP
在yii中新增一个用户验证的方法详解
2013/06/20 PHP
php实现的短网址算法分享
2014/06/20 PHP
php实现概率性随机抽奖代码
2016/01/02 PHP
Yii2实现log输出到file及database的方法
2016/11/12 PHP
用javascript做拖动布局的思路
2008/05/31 Javascript
jQuery 版本的文本输入框检查器Input Check
2009/07/09 Javascript
解析js如何获取当前url中的参数值并复制给input
2013/06/23 Javascript
jQuery中:selected选择器用法实例
2015/01/04 Javascript
jQuery插件StickUp实现网页导航置顶
2015/04/12 Javascript
jQuery EasyUi实战教程之布局篇
2016/01/26 Javascript
JavaScript事件代理和委托详解
2016/04/08 Javascript
Vue.js 2.0 和 React、Augular等其他前端框架大比拼
2016/10/08 Javascript
微信js-sdk分享功能接口常用逻辑封装示例
2016/10/13 Javascript
JS匿名函数类生成方式实例分析
2016/11/26 Javascript
JS新包管理工具yarn和npm的对比与使用入门
2016/12/09 Javascript
angular使用bootstrap方法手动启动的实例代码
2017/07/18 Javascript
本地存储localStorage用法详解
2017/07/31 Javascript
javascript实现计算指定范围内的质数示例
2018/12/29 Javascript
JavaScript setInterval()与setTimeout()计时器
2019/12/27 Javascript
使用js实现单链解决前端队列问题的方法
2020/02/03 Javascript
在Uni中使用Vue的EventBus总线机制操作
2020/07/31 Javascript
[03:02]2014DOTA2西雅图邀请赛 让队员自己告诉你DK NAVI备战情况
2014/07/08 DOTA
[44:50]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第二局
2016/02/26 DOTA
[00:35]DOTA2上海特级锦标赛 MVP.Phx战队宣传片
2016/03/04 DOTA
[42:06]2019国际邀请赛全明星赛 8.23
2019/09/05 DOTA
python线程安全及多进程多线程实现方法详解
2019/09/27 Python
python3的UnicodeDecodeError解决方法
2019/12/20 Python
HTML5中判断用户是否正在浏览页面的方法
2014/05/03 HTML / CSS
澳大利亚购买健身器材网站:Gym Direct
2019/12/19 全球购物
公司离职证明范本
2014/01/13 职场文书
甜品店创业计划书
2014/08/14 职场文书
物联网工程专业推荐信
2014/09/08 职场文书
整改落实情况汇报材料
2014/10/29 职场文书
早恋主题班会
2015/08/14 职场文书
Django集成富文本编辑器summernote的实现步骤
2021/05/31 Python