Composer是一个非常流行的PHP包依赖管理工具,它已经取代了PEAR包管理器。PHP开发者掌握Composer是很有必要的。对于用户来说,Composer非常简单,所需的代码将通过一个简单的命令传递。将包下载到vendor目录,开发者就可以导入包使用了。关键在于你项目定义的composer.json,它可以定义项目所依赖的包(可能有多个),而依赖的包可能会依赖其他包(这就是组件的好处),你不用担心这些,Composer会自动下载你需要的一切,一切都在composer.json的定义中。Composer对用户来说是非常透明的,但是背后的思想还是要明白,它的诞生并不是偶然的。得益于Github的快速发展,PHP语言越来越现代化,显得更加高大上。要想理解Composer,首先要了解它的结构:Composer的结构Composer命令行工具:这个理解比较简单。通过用户定义的Composer.json下载你需要的代码。如果你只是简单地使用Composer,那么你可以掌握一些特定的命令。自动加载代码加载器:通过Composer,开发者可以有多种使用方式,关键在于PHP的命名空间概念和PSR-4标准的制定。Composer刚刚基于这两者开发了一个代码自动加载器Github:有了Github,PHP开发者可以在上面托管开源代码,而Composer的开发起源于Github。Composer本质上是将Github上的代码下载到本地。Packagist:对于用户来说,使用的是Composer的命令行工具,那么命令行工具如何知道用户可以使用多少个包呢?这主要取决于Packagist。Packagist是Composer的主要包信息仓库。包开发者将具体代码托管在Github上,并将包信息提交给Packagist,以便用户可以通过Composer使用它。Composer根据本地定义的composer.json信息查询Packagist,Packagist根据Composer.json/Package.json信息解析,最终对应到github仓库。当Composer最后下载代码时,需要DependsonComposerontheGithubrepository.json,这里涉及到三种composer.json,含义不同。Composer.json:这是Composer的核心,是Composer的规则。Composer.json的三种类型上面也说了,在使用的时候一定要注意区分,我是初学者。Composer命令行工具composerinit用户可以在自己的项目下创建composer.json来定义你项目的依赖,也可以通过composerinit交互创建composer.json.composerinstall应该是最常用的命令了。Composer会根据本地的composer.json安装包,将下载的包放到项目下的vendor目录下,并将安装时的包版本信息放入composer.lock中,以锁定版本。其实在安装的时候,如果发现composer.lock的版本和当前vendor目录下的代码版本一致,Composer什么都不做。composer.lock的目的是让你安心的在当前这个版本下工作,而无需获取最新版本的包。Composer更新那么如何更新composer.lock以获得最新版本的包呢?您可以通过此命令更新最新版本的包作曲家配置。建议了解全局的配置保存在COMPOSER_HOME/config.json中,非全局的配置信息存放在项目目录下。composerconfig--list-gcomposerconfig-gnotify-on-installfalsecomposerglobalconfigbin-dir--absolute这个命令不常用,但个人认为还是很重要的。使用普通的install命令就是将项目的所有依赖包下载到项目的vendor目录下。并且通过这个命令,所有的代码和它的依赖包都放在一个目录下,相当于执行了一个gitclone命令。通常,包开发人员可能会使用此命令来修复错误。composerglobal这是一个全局安装命令,可以让你在COMPOSER_HOME目录下执行Composer命令,比如install、update。当然,你的COMPOSER_HOME应该在$PATH环境中。例如,执行composerglobalrequirefabpot/php-cs-fixer,现在php-cs-fixer命令行可以全局运行了,以后如果要更新,修改项目下的composer.json时运行composerglobalupdatecomposerdump-autoload即可不必运行composerupdate命令来更新文件。有时您可以使用此命令来更新加载程序。比如你要引用本地的自定义包(不是packagist的),这个命令后面会通过实践来讲解。
