linux下安装composer
安装预知
在linux下,安装composer,需要php环境,并且需要 PHP 5.3.2+ 以上版本,且需要开启 openssl(高版本自带默认开启)
查看当前php版本
php -v
可以设置新的临时环境变量,比如php80
export PATH=/www/server/php/80/bin:$PATH
下载安装
1.下载安装脚本 composer-setup.php
到当前目录。
php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');"
2.执行安装过程
php composer-setup.php
3.删除安装脚本
php -r "unlink('composer-setup.php');"
4.安装完成后会有composer.phar文件,运行php composer.phar就可以查看composer,也可以直接使用 composer 命令,因为一般会自动安装到 /usr/bin/composer,使用命令查看composer版本
composer --version
这个 composer.char,虽然是一个phar包,不过它在头部带了 #!/usr/bin/env php(也就是它会自动引用环境变量里的php,这就是这个phar文件能运行的原因),直接使用composer命令就相当于复制了一份phar文件(准确来说并不是复制,只是类似,代码基本是一样的,功能也相同)【对比composer文件和phar文件内容即可证明】
--伪代码
cp composer.phar /usr/bin/composer
升级与卸载
使用命令升级
composer self-update
卸载composer,前面也说过了,composer的原理就是复制了一份phar文件,那么使用 which composer 即可查看到所在位置,删除使用 rm 即可
rm $(which composer)
切换源
更换国内源
composer config -g repo.packagist composer https://packagist.phpcomposer.com
或阿里云源
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
官方源
composer config -g repo.packagist composer https://repo.packagist.org
其他源
腾讯:https://mirrors.cloud.tencent.com/composer/
删除代理源
composer config -g --unset repos.packagist
如果不使用 -g 参数,则仅对当前项目生效。
使用Composer
一般我们就是使用 composer 进行依赖的管理,常见的功能就是增删改查依赖包
在使用 composer 命令时,首先它会检测当然目录,是否存在 composer.json 文件,如果不存在依次检测上级目录,如果上级目录有 composer.json,那么应该新建一个 composer.json,内容为空的json对象{}即可,保存这个文件【或者composer init,效果是一样的】,此时在拉取时,会生成一个 composer.lock 文件,以及 vendor 目录,lock文件是冲突锁定文件,vender是拉取的依赖所在目录
尝试拉取一个项目
--普通安装
composer require xxx/xxx
--强制安装
composer require phpoffice/phpspreadsheet --ignore-platform-reqs
--安装指定版本,软件包:版本号
composer require "illuminate/redis:5.5.*"
composer require "predis/predis:^1.1"
composer require "foo/bar:1.0.0"
参数说明
--ignore-platform-reqs: ignore all platform requirements (php
, hhvm
, lib-*
and ext-*
) and force the installation even if the local machine does not fulfill these. See also the platform
config option
忽略所有平台要求(php,hhvm,lib- *和ext- *)并强制安装,即使本地计算机不满足这些要求(此参数可选)
查看当前已经安装的依赖包:
composer show
搜索网络包
composer search 包名
该命令会输出包及其描述信息,如果只想输出包名可以使用 --only-name 参数:
composer search --only-name 包名
卸载某个依赖包:
composer remove vendorName/packageName
例如
composer remove monolog/monolog
更新依赖包
更新所有(根据json文件和lock文件,所以这两个文件必须存在,应该加入到版本库里)
composer update
更新指定的包
composer update monolog/monolog
更新指定的多个包
composer update monolog/monolog symfony/dependency-injection
还可以通过通配符匹配包
composer update monolog/monolog symfony/*
关于Composer开发
psr是一个composer规范,当你在使用composer init创建时,它在生成json文件时,可能如下
{
"name": "aaa/bbb",
"autoload": {
"psr-4": {
"Aaa\\Bbb\\": "src/"
}
},
"authors": [
{
"name": "abc"
}
],
"minimum-stability": "1.0.0",
"require": {}
}
name表示包名,authors作者,mini-stability是最低使用的稳定版本号,require是指外部的依赖或环境,那么autoload是指自动加载的规则,默认情况下使用psr-4,其实就算你不符合psr规范,依然是可以加载的
psr4几点关键点
PSR-4中,在类名中使用下划线没有任何特殊含义。【而PSR-0则规定类名中的下划线_会被转化成目录分隔符。】
\<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>
完全限定的类名必须有一个顶级命名空间名称,也称为“供应商命名空间”。
完全限定类名可以有一个或多个子命名空间名称。
完全限定类名必须具有终止类名。
完全限定类名中的字母字符可以是小写和大写的任意组合。
所有类名都必须以区分大小写的方式引用。
终止类名对应于以.php结尾的文件名。文件名必须与终止类名的大小写匹配。
自动加载器实现不得抛出异常,不得引发任何级别的错误,也不应返回值。
简单来说,就是大小写严格,命名空间结构对应目录结构,这和我们平时写法也是基本一致的。
说到底,这个psr-4规范,就只是和普通写法基本没区别,因为正常我们也是这么写的。
psr-4实现类似如下
<?php
/**
* 一个具体项目的实例
*
* 当使用 SPL 注册此自动加载器后,执行以下语句将从
* /path/to/project/src/Baz/Qux.php 载入 \Foo\Bar\Baz\Qux 类:
*
* new \Foo\Bar\Baz\Qux;
*
* @param string $class 完整的类名
* @return void
*/
spl_autoload_register(function ($class) {
// 具体项目命名空间前缀
$prefix = 'Foo\\Bar\\';
// 命名空间前缀的基目录
$base_dir = __DIR__ . '/src/';
// 判断类名是否具有本命名空间前缀
$len = strlen($prefix);
if (strncmp($prefix, $class, $len) !== 0) {
// 不含本命名空间前缀,退出本自动载入器
return;
}
// 截取相应类名
$relative_class = substr($class, $len);
// 将命名空间前缀替作为文件基目录,然后
// 将类名中的命名空间分隔符替换成文件分隔符,
// 最后添加 .php 后缀
$file = $base_dir . str_replace('\\', '/', $relative_class) . '.php';
// 如果以上文件存在,则将其载入
if (file_exists($file)) {
require $file;
}
});
当然了,上面只是伪代码,查看vendor里的composer,我们发现它并不是那么简单,而是有缓存的
如果没有HHVM【正常情况下】,它是加载 autoload_static.php 里的getInitializer方法绑定 prefixLengthsPsr4、prefixDirsPsr4、classMap三个数组,及其自动加载 $files 里的文件
这四个大概如下作用
prefixLengthsPsr4 数组,是对全类名的第一个字母的分类,以及记录其全类名长度,
prefixDirsPsr4 记录的是完整的类名,及其所在目录对应关系
classMap 是普通的类名及其路径【不符合psr-4规范】
files 更简单了,就是载入一下普通的php文件,相当于 require 一次,比如有时候写一些简单的函数或类,总之是引入没有命名空间的php文件。
对应在composer.json文件里,就是三个内容,比如
"autoload": {
"classmap": ["othsrc/","classsrc.php"],
"files": ["othsrc/filesrc.php"],
"psr-4": {"Foo\Bar\": "src"} }
如果自己手动增删改了一些内容,那么先更新composer.json的autoload,接下来还要更新这些缓存,否则composer无法识别,这个命令是
composer dump-autoload
它能重新识别,并更新 autoload_static.php 里的数据,这样才能够使用。
发布在线composer项目?
自己注册composer官方网站的账号,这样就可以提交github的地址,也就是说需要先提交到github,公开仓库,此时我们得到 github 的 https 地址
在composer官网,提交这个 https 地址即可,官方网址:https://packagist.org/
文章作者: 朱丰华
文章链接: https://smart.52dixiaowo.com/blog/post-206.html
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。