多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## composer **last update: 2022-05-26 10:23:11** ---- [TOC=3,8] ---- ### 前言 ![](https://getcomposer.org/img/logo-composer-transparent3.png) [composer](https://getcomposer.org/) 之如 php,正如 npm 之如 nodejs,composer 是一个项目[依赖包](https://packagist.org/)管理工具。本文旨在全面介绍它的用法,学习目标是从此不会再惧怕任何php项目的包依赖管理问题,并且能够自己维护开源包。 --- ### 架构 ~~~shell $ composer -v ______ / ____/___ ____ ___ ____ ____ ________ _____ / / / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/ / /___/ /_/ / / / / / / /_/ / /_/ (__ ) __/ / \____/\____/_/ /_/ /_/ .___/\____/____/\___/_/ /_/ Composer version 2.2.13 2022-05-25 21:37:25 ~~~ ~~~ app ├─vendor │ ├─composer │ │ ├─autoload_classmap.php │ │ ├─autoload_namespaces.php │ │ ├─autoload_psr4.php │ │ ├─autoload_real.php │ │ ├─autoload_static.php │ │ ├─ClassLoader.php │ │ ├─installed.json │ │ ├─installed.php │ │ ├─InstalledVersions.php │ │ ├─LICENSE │ │ └─platform_check.php │ │ │ ├─monolog │ │ └─monolog │ │ ├─src │ │ ├─LICENSE │ │ ├─composer.json │ │ └─... │ │ │ ├─autoload.php │ │ │ └─... │ ├─composer.json └─composer.lock ~~~ ---- ### 常用命令 **命令原型:** ~~~shell composer command [options] [arguments] 命令 选项 参数 ~~~ **基础命令选项:** 以下命令选项可以在每条命令中使用: ~~~shell -h, --help 查看帮助信息 -q, --quiet 不输出任何信息 -V, --version 查看版本号 --ansi 强制ANSI编码格式输出 --no-ansi 取消ANSI编码格式输出 -n, --no-interaction 不询问何互动问题 --profile 显示耗时和内存使用信息 --no-plugins 不使用插件 --no-scripts 不执行 composer.json 文件中定义的所有脚本 -d, --working-dir=WORKING-DIR 如果指定,使用给定目录作为工作目录 --no-cache 不使用缓存 -v|vv|vvv, --verbose 显示提示信息:-v正常输出,-vv更多的粗略输出,-vvv调试 ~~~ **查看某个命令的使用帮助信息:** ~~~shell composer require -h ~~~ ---- **全部命令:** ~~~shell about 显示关于Composer的简短信息。 archive 创建这个作曲家软件包的存档。 browse 在你的浏览器中打开软件包的存储库URL或主页。 cc 清除 composer 的内部软件包缓存。 check-platform-reqs 检查平台要求是否得到满足。 clear-cache 清除 composer 的内部软件包缓存。 clearcache 清除 composer 的内部软件包缓存。 config 设置配置选项。 create-project 从软件包中创建新的项目到指定的目录。 depends 显示包的被依赖信息 diagnose 诊断系统以识别常见错误。 dump-autoload 转储自动加载器。 dumpautoload 转储自动加载器。 exec 执行一个出售的二进制文件/脚本。 fund 发现如何为维护你的依赖关系提供资金。 global 允许在全局 composer 目录($COMPOSER_HOME)中运行命令。 help 显示一个命令的帮助 home 在浏览器中打开软件包的存储库 URL 或主页。 i 从 composer.lock 文件中安装项目的依赖关系(如果有的话),或者回到 composer.json 文件中。 info 显示软件包的信息。 init 在当前目录下创建一个基本的 composer.json 文件。 install 如果存在的话,从 composer.lock 文件中安装项目的依赖性,或者回到 composer.json 文件中。 licenses 显示依赖项的许可信息。 list 列举命令 outdated 显示有更新的已安装软件包的列表,包括其最新版本。 prohibits 显示哪些软件包阻止了给定的软件包被安装(检查已安装的包是否会与给定目标冲突,以验证是否可以升级) reinstall 卸载和重新安装给定的软件包名称 remove 从 require 或 require-dev 中删除一个软件包。 require 将需要的软件包添加到你的 composer.json 中并安装它们。 run 运行 composer.json 中定义的脚本。 run-script 运行 composer.json 中定义的脚本。 search 搜索软件包。 self-update 将 composer.phar 更新到最新版本。 self-update 将 composer.phar 更新到最新的版本。 show 显示软件包的信息。 status 显示本地修改的软件包的列表。 suggests 显示软件包的建议。 u 根据 composer.json 将你的依赖项升级到最新版本,并更新 composer.lock 文件。 update 根据 composer.json 将你的依赖关系升级到最新版本,并更新 composer.lock 文件。 upgrade 根据 composer.json 将你的依赖关系升级到最新的版本,并更新 composer.lock 文件。 validate 验证 composer.json 和 composer.lock。 why 显示哪些软件包会导致给定的软件包被安装。 why-not 显示哪些软件包阻止给定的软件包被安装。 ~~~ ---- **返回结果码** ~~~ 0: OK 正确码 1: 通常/未知错误码 2: 需要解决的错误码 ~~~ ---- #### 命令使用详解 ##### init ---- ##### require ~~~shell composer require [options] [--] [<packages>]... ~~~ ~~~shell composer require --prefer-dist foo/bar ~~~ |选项|说明| |--|--| | --dev |添加需求到require-dev。| | --dry-run |输出操作,但不会执行任何东西(隐含地启用 --verbose)。| | --prefer-source |在可能的情况下,强制从软件包源头安装,包括VCS信息。| | --prefer-dist |强制从软件包dist安装(默认行为)。| | --prefer-install=PREFER-INSTALL |强制从软件包dist|source|auto中安装(开发版本自动选择source,其他版本选择dist)。| | --fixed |将固定版本写入 composer.json。| | --no-suggest |DEPRECATED: 这个标志已经不存在了。| | --no-progress |不输出下载进度。| | --no-update |禁用自动更新依赖项(意味着--不安装)。| | --no-install |在更新composer.lock文件后跳过安装步骤。| | --update-no-dev |使用 --no-dev 选项运行依赖性更新。| |-w, --update-with-dependencies |准许继承的依赖关系被更新,但那些属于根需求的除外。| |-W, --update-with-all-dependencies |允许更新所有继承的依赖,包括那些属于根需求的依赖。| | --with-dependencies |--update with-dependencies的别名| | --with-all-dependencies |--update with-all-dependencies的别名。| | --ignore-platform-req=IGNORE-PLATFORM-REQ |忽略一个特定的平台需求(php和ext-包)。(允许多个值)| | --ignore-platform-reqs |忽略所有的平台要求(php & ext- packages)。| | --prefer-stable |优先选择稳定版本的依赖项。| | --prefer-lowest |优先选择最低版本的依赖关系。| | --sort-packages |在添加/更新新的依赖关系时对软件包进行排序| |-o, --optimize-autoloader |在自动加载器转储时优化自动加载器| |-a, --classmap-authoritative |只从classmap上自动加载类。隐含地启用 `--优化自动加载器 `。| | --apcu-autoloader |使用APCu来缓存找到/未找到的类。| | --apcu-autoloader-prefix=APCU-AUTOLOADER-PREFIX |为APCu自动加载器缓存使用一个自定义前缀。隐式启用 --apcu-autoloader| |-h, --help |显示此帮助信息| |-q, --quiet |不输出任何信息| |-V, --version |显示此应用程序版本| | --ansi |强制ANSI输出| | --no-ansi |禁用ANSI输出| |-n, --no-interaction |不提出任何互动问题| | --profile |显示时间和内存使用信息| | --no-plugins |是否禁用插件。| | --no-scripts |跳过composer.json文件中定义的所有脚本的执行。| |-d, --working-dir=WORKING-DIR |如果指定,使用给定的目录作为工作目录。| | --no-cache |防止使用缓存| |-v|vv|vvv, --verbose |增加信息的粗略程度。1表示正常输出,2表示更多的粗略输出,3表示调试。| ---- ##### serach ~~~ composer search monolog ~~~ ---- ##### show ~~~ composer show topthink/* -a composer show topthink/think 5.0.* -a composer show overtrue/wechat ~5.0 -a ~~~ ---- ##### install ---- ##### prohibits ~~~ composer prohibits symfony/symfony 3.1 composer prohibits php 5.2 ~~~ ---- ##### update ~~~ # 会有网络检查最新的版本 $: composer update Loading composer repositories with package information Updating dependencies Nothing to modify in lock file Installing dependencies from lock file (including require-dev) Nothing to install, update or remove Generating autoload files # 很快有本地安装缓存的话不需要网络请求 $: composer install Installing dependencies from lock file (including require-dev) Verifying lock file contents can be installed on current platform. Nothing to install, update or remove Generating autoload files ~~~ ---- ##### remove ---- ##### dump-autoload ~~~ composer dump-autoload -o -a --no-dev --apcu ~~~ ---- ##### status `status` 命令可以检查你本地代码中的修改内容: ~~~ composer status -v ~~~ ---- ##### list ---- ~~~shell composer --version composer self-update composer diagnose composer show --platform composer check-platform-reqs composer config -g -l composer global config bin-dir --absolute composer clear composer install composer require xxx/xxx --dry-run composer remove xxx/xxx composer update composer dump-autoload composer status composer search xxx ~~~ ---- ### 加载器 你也可以查阅 optimizing the autoloader 了解关于自动加载器的优化. > 注意:Composer 提供自己的加载器,但如果你不想使用那个而想自己配置加载器的话,你可以试试 include vendor/composer/autoload_*.php 这些文件所返回的关联数组来实现。 ---- #### 依赖管理 [Versions and constraints - Composer](https://getcomposer.org/doc/articles/versions.md#versions-and-constraints) [Package Semver Checker - madewithlove](https://semver.madewithlove.com/?package=overtrue%2Fwechat&constraint=~5.0.0&stability=stable)(`包:"约束@稳定性"`) ~~~ composer require overtrue/wechat:"~5.0.0@dev" ~~~ ![](http://cdn.aipin100.cn/54a73640c30ac99da8de85ccb9fcabc2) ---- ### 使用技巧 ---- ### 相关工具链 [Packagist / Composer 中国全量镜像](https://pkg.xyz/#tip2) > 如果你的 package 源码托管在 Github 或 Bitbucket 上,可以通过设置 service hook 让 packagist.org 在你每次 commit 后抓取更新。 ---- ### 语义化版本 [语义化版本 2.0.0 | Semantic Versioning](https://semver.org/lang/zh-CN/) x.y.z 大版本.次版本.修订版 版本格式:主版本号.次版本号.修订号,版本号递增规则如下: 主版本号:当你做了不兼容的 API 修改。 次版本号:当你做了向下兼容的功能性新增。 修订号:当你做了向下兼容的问题修正。 先行版本号及版本编译信息可以加到“主版本号.次版本号.修订号”的后面,作为延伸。 `*` 等价于 0 或无限增长的版本号 `1` 等价于 `1.*.*` `1.0` 等价于 `1.0.*` `1.0.*` 等价于 `>=1.0.0 <1.1.0` `>1.0` 等价于 `>1.0.0` ---- #### 申明所需版本范围:最新的和稳定的 ##### 波形符 ~: 保守的使用最新版,但对于非稳定版阶段可能会破坏兼容性 `~1.2` 等价于 `>=1.2.0 and <2.0.0` `~1.2.0` 等价于 `>=1.2.0 and <1.3.0` `~1.2.3` 等价于 `>=1.2.3 and <1.3.0` `~0.3` 等价于 `>=0.3.0 and <1.0.0` (非稳定版本时可能会破坏兼容性) > 用 ~ 指定一个最小版本,但允许指定的最后一个数字无限增长。 >[tip] 注意: `~1` 与 `~1.0` 是相同的,因为它不会允许主版本号增加以试图保持向后兼容性。 ---- ##### 脱字符 ^: 保证兼容性的前提下积极使用最新版 `^1.2` 等价于 `>=1.2.0 and <2.0.0` `^1.2.0` 等价于 `>=1.2.0 and <2.0.0` `^1.2.3` 等价于 `>=1.2.3 and <2.0.0` `^0.3` 等价于 `>=0.3.0 and <0.4.0` (而不是 `>=0.3.0 and <1.0.0 `) > `^` 尽量使用最新版本,但保证不产生兼容问题。只限定不会超过下一个主版本就行(对于非 `0.*` 的稳定版)。 在 `x.y` 的情况下 `^` 、 `~` 是一样的,都代表 `>=x.y and <(x+1).0.0`。(`x > 0` 时) **要重点注意的一点是,主版本号为 `0` 表示这是一个非稳定版本(unstable),如果处于非稳定状态,次版本号是允许不向下兼容的!,即不同的次版本可能是不保证兼容性的,所以 `^` 要保证兼容性就要固定次版本号了**,这点需要注意。所以 `^0.3.0` 等价于 `>=0.3.0 and <0.4.0`,而不是 `<1.0.0`。 https://blog.csdn.net/youcijibi/article/details/81939418 https://blog.csdn.net/u013866352/article/details/105412462 https://blog.csdn.net/eebaicai/article/details/88047833 ---- ### 优化 #### 类映射加载优化 ~~~ composer dump-autoload -a --apcu --no-dev # 优化级别1:类映射生成 composer dump-autoload --optimize --no-dev # 优化级别 2/A :权威类映射 composer dump-autoload --classmap-authoritative --no-dev # 优化级别 2/B: APCu 缓存 composer dump-autoload --apcu --no-dev ~~~ ~~~ "optimize-autoloader": true "classmap-authoritative": true "apcu-autoloader": true ~~~ ~~~ Administrator@PC-201908081131 MINGW64 /d/web/composer-yf $ composer dump-autoload --optimize --no-dev Generating optimized autoload files Generated optimized autoload files containing 23388 classes Administrator@PC-201908081131 MINGW64 /d/web/composer-yf $ composer dump-autoload --classmap-authoritative --no-dev Generating optimized autoload files (authoritative) Generated optimized autoload files (authoritative) containing 23388 classes Administrator@PC-201908081131 MINGW64 /d/web/composer-yf $ composer dump-autoload --apcu --no-dev Generating autoload files Generated autoload files ~~~ 类映射生成实质上是将 PSR-4/PSR-0 规则转换为类映射规则。这使得一切都快很多,因为已知的类映射会立即返回路径,而 Composer 可以保证类在那里,因此不需要文件系统检查。 在 PHP 5.6+ 中,类映射也缓存在 opcache 中,这大大改善了初始化时间。如果确保启用了 opcache ,那么类映射应该会立即加载,类加载也会很快。 [3.2. 自动加载器优化 - Composer 中文文档 - 文江博客](https://www.wenjiangs.com/doc/s5h0aqva#2b8a101b03db9ddb90d951b1355f9d7d) [cachetool | Deployer](https://deployer.org/docs/7.x/contrib/cachetool#usage) 由于 APCu 和 OPcache 处理编译和缓存文件,它们应该在为新版本创建符号链接后立即执行 https://learnku.com/articles/10985/deployer-real-experience-sharing ~~~ apcu_clear_cache(); apc.enabled opcache_reset(); ~~~ ~~~ 即使立即执行可能还会有问题,应该这样: 发布前,关闭op缓存,清除op缓存 发布后,开启op缓存 ~~~ #### 权威类映射加载优化 #### APCu 缓存加载优化 #### 镜像加速 恢复 ~~~ composer config -g --unset repos.packagist ~~~ 项目中配置: ``` { "repositories": [ { "type": "composer", "url": "https://mirrors.cloud.tencent.com/composer/", "canonical": false }, { "type": "composer", "url": "https://mirrors.aliyun.com/composer/", "canonical": false } ], "require": { "monolog/monolog": "1.0.*" } } ``` 全局配置: ~~~ composer clear composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ ~~~ [阿里云Composer镜像站-阿里云开发者社区](https://developer.aliyun.com/composer) > 腾讯云镜像 `https://mirrors.cloud.tencent.com/composer/` ---- ### 开发自己的包 ---- ### 分析社区的趋势 使用 统计功能 可以很方便的帮助我们分析 [社区](https://packagist.org) 主流php版本,以及包版本使用的情况,帮助我们预测社区走向,及时调整方向。 ![](http://cdn.aipin100.cn/87accd08b2d3f13a8a299157050e1543) https://packagist.org/packages/guzzlehttp/guzzle/stats#dev-master ![](http://cdn.aipin100.cn/3c2230a4bc1c0db822150cbb1f6e81f3) https://packagist.org/packages/guzzlehttp/guzzle/php-stats ---- ### 常见问题 #### 如果管理和使用非标准的库? #### 如果使用自定义储存库的包? https://stackoverflow.com/questions/21314381/how-to-correctly-require-a-specific-commit-in-composer-so-that-it-would-be-avail ```json "repositories": [ { "type": "composer", "url": "https://mirrors.cloud.tencent.com/composer/", "canonical": false }, { "type": "composer", "url": "https://mirrors.aliyun.com/composer/", "canonical": false }, { "type": "vcs", "url": "https://github.com/walkor/workerman" } ], "require": { "workerman/workerman": "dev-master#84b7cb514003aee563ee4c13fad5895b67173707" }, ``` #### 包之间出现版本依赖冲突怎么办? 1. 取舍 2. 提 request pull 3. 有能力自己 fock一个版本单独维护 #### 三方包的安全性如何保证? 1. 使用知名的包 2. 引入项目前做必要的代码安全审查 3. 锁定使用版本 #### 三方包仓库作者删库跑路了怎么办? 1. fock github 仓库 2. 定期备份完整代码库 #### 如何审查开源协许可证,避免授权风险? ![](https://img-blog.csdnimg.cn/20190619094018567.jpeg) [GPL、MIT、Apache...开发者如何选择开源协议?一文讲清根本区别!_走神的阿圆的博客-CSDN博客](https://blog.csdn.net/yhan_shen/article/details/122505465) #### root 安全 [How do I install untrusted packages safely? Is it safe to run Composer as superuser or root? - Composer](https://getcomposer.org/doc/faqs/how-to-install-untrusted-packages-safely.md) ~~~ vi /etc/profile COMPOSER_ALLOW_SUPERUSER=1 export COMPOSER_ALLOW_SUPERUSER source /etc/profile ~~~ ---- ~~~ composer status 怎么知道文件变化了,它是如何工作的,文件 md5 只跟内容变化有关吗,复制文件,内容一样修改日期不一样,文件MD5一样吗。 https://www.zhihu.com/question/295147561/answer/496545059 1. 根据安装缓存中记录每个文件的MD5?经测试删除缓存,依然能检测到文件内容修改了。 2. 猜测是在其它地方有相关的缓存,暂时没有找到,可能要去看源码才行 3. 难道它用了网络去检查?能把你删除的 .md 文件都能检查出来,即使你不是在当前机器上安装的,如果不是网络,那就说明 还是 vendor 中记录了什么 ~~~ ---- ~~~ https://developer.aliyun.com/composer composer config repo.packagist composer https://mirrors.aliyun.com/composer/ composer config --unset repos.packagist composer self-update composer clear composer update --lock ~~~ ~~~ https://mirrors.tencent.com/composer/ ~~~ ---- ### 扩展 [Composer Documentation](https://getcomposer.org/doc/) [2.1. 简介 - Composer 中文文档 - 文江博客](https://www.wenjiangs.com/doc/k5u5ciqg) [PHP-FIG — PHP Framework Interop Group - PHP-FIG](https://www.php-fig.org/) [PHP 开发者该知道的 5 个 Composer 小技巧 - SegmentFault 思否](https://segmentfault.com/a/1190000000355928) [Fast, disk space efficient package manager | pnpm](https://pnpm.io/zh/) > 一个老牌的 node.js 包管理器,支持 npm 的所有功能,用来替代 npm。它的模块是全局存储,每个项目内部使用硬链接,所以很省空间,而且安装速度快。 [【Linux】硬链接、软链接及inode详解_长着胡萝卜须的栗子的博客-CSDN博客](https://blog.csdn.net/lixungogogo/article/details/52176571) > 3 打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从inode号码得知文件名。 > 第3点使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。因为系统通过inode号码,识别运行中的文件,不通过文件名。更新的时候,新版文件以同样的文件名,生成一个新的inode,不会影响到运行中的文件。等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的inode则被回收。 [1.1. 翻译说明 | 基础信息 |《Composer 中文文档 2018》| PHP 技术论坛](https://learnku.com/docs/composer/2018/about/2080) ---- ~~~shell $: composer diagnose Checking platform settings: PHP was compiled with --with-curlwrappers which will cause issues with HTTP authentication and GitHub. Recompile it without this flag if possible Checking git settings: OK Checking http connectivity to packagist: OK Checking https connectivity to packagist: OK Checking github.com rate limit: OK Checking disk free space: OK Checking pubkeys: Tags Public Key Fingerprint: 57815BA2 7E54DC31 7ECC7CC5 573090D0 87719BA6 8F3BB723 4E5D42D0 84A14642 Dev Public Key Fingerprint: 4AC45767 E5EC2265 2F0C1167 CBBB8A2B 0C708369 153E328C AD90147D AFE50952 OK Checking composer version: OK Composer version: 2.3.5 PHP version: 7.2.16 PHP binary path: /usr/local/php/bin/php OpenSSL version: OpenSSL 1.0.2k 26 Jan 2017 cURL version: 7.37.0 libz 1.2.8 ssl OpenSSL/1.0.2k zip: extension present, unzip present, 7-Zip not available ~~~ [NixOS 的包管理设计(英文) ](https://blog.wesleyac.com/posts/the-curse-of-nixos) > NixOS 是一个 Linux 发行版,具有独一无二的包管理机制,**彻底解决了版本冲突问题,不同版本的软件可以同时运行,新版本也可以无痛回滚到任意老版本。**