正文
Composer安装,可以参阅 https://ibaiyang.github.io/blog/composer/2017/07/25/Linux-下安装Composer.html
Composer安装好后,我们就可以在项目中使用composer了。
查看composer相关信息及命令:
composer
root@~:# composer
______
/ ____/___ ____ ___ ____ ____ ________ _____
/ / / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__ ) __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
/_/
Composer version 2.3.5 2022-04-13 16:43:00
Usage:
command [options] [arguments]
Options:
-h, --help Display help for the given command. When no command is given display help for the list command
-q, --quiet Do not output any message
-V, --version Display this application version
--ansi|--no-ansi Force (or disable --no-ansi) ANSI output
-n, --no-interaction Do not ask any interactive question
--profile Display timing and memory usage information
--no-plugins Whether to disable plugins.
--no-scripts Skips the execution of all scripts defined in composer.json file.
-d, --working-dir=WORKING-DIR If specified, use the given directory as working directory.
--no-cache Prevent use of the cache
-v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
Available commands:
about Shows a short information about Composer.
archive Creates an archive of this composer package.
browse [home] Opens the package's repository URL or homepage in your browser.
check-platform-reqs Check that platform requirements are satisfied.
clear-cache [clearcache|cc] Clears composer's internal package cache.
completion Dump the shell completion script
config Sets config options.
create-project Creates new project from a package into given directory.
depends [why] Shows which packages cause the given package to be installed.
diagnose Diagnoses the system to identify common errors.
dump-autoload [dumpautoload] Dumps the autoloader.
exec Executes a vendored binary/script.
fund Discover how to help fund the maintenance of your dependencies.
global Allows running commands in the global composer dir ($COMPOSER_HOME).
help Display help for a command
init Creates a basic composer.json file in current directory.
install [i] Installs the project dependencies from the composer.lock file if present, or falls back on the composer.json.
licenses Shows information about licenses of dependencies.
list List commands
outdated Shows a list of installed packages that have updates available, including their latest version.
prohibits [why-not] Shows which packages prevent the given package from being installed.
reinstall Uninstalls and reinstalls the given package names
remove Removes a package from the require or require-dev.
require Adds required packages to your composer.json and installs them.
run-script [run] Runs the scripts defined in composer.json.
search Searches for packages.
self-update [selfupdate] Updates composer.phar to the latest version.
show [info] Shows information about packages.
status Shows a list of locally modified packages.
suggests Shows package suggestions.
update [u|upgrade] Updates your dependencies to the latest version according to composer.json, and updates the composer.lock file.
validate Validates a composer.json and composer.lock.
root@~:#
查看全局安装的包名称和版本:
composer global show
root@~:# ls -l /root/.composer
total 1976
-rw-r--r-- 1 root root 1993462 May 9 16:52 2022-04-13_16-39-56-1.10.26-old.phar
-rw------- 1 root root 207 May 9 16:41 auth.json
drwxr-xr-x 4 root root 48 May 6 10:44 cache
-rw-r--r-- 1 root root 26 Aug 2 21:57 composer.json
-rw-r--r-- 1 root root 571 Aug 2 21:57 composer.lock
-rw------- 1 root root 50 Aug 2 21:49 config.json
-rw-r--r-- 1 root root 799 May 9 16:13 keys.dev.pub
-rw-r--r-- 1 root root 799 May 9 16:13 keys.tags.pub
-rw-r--r-- 1 root root 7 May 9 16:52 update-channel
drwxr-xr-x 4 root root 53 Aug 2 21:57 vendor
root@~:#
敲你不明白的命令,在命令后面加-h
就可以查看相应的帮助信息,如 show
命令:
composer show -h
root@~:# composer show -h
Description:
Shows information about packages.
Usage:
show [options] [--] [<package> [<version>]]
info
Arguments:
package Package to inspect. Or a name including a wildcard (*) to filter lists of packages instead.
version Version or version constraint to inspect
Options:
--all List all packages
--locked List all locked packages
-i, --installed List installed packages only (enabled by default, only present for BC).
-p, --platform List platform packages only
-a, --available List available packages only
-s, --self Show the root package information
-N, --name-only List package names only
-P, --path Show package paths
-t, --tree List the dependencies as a tree
-l, --latest Show the latest version
-o, --outdated Show the latest version but only for packages that are outdated
--ignore=IGNORE Ignore specified package(s). Use it with the --outdated option if you don't want to be informed about new versions of some packages. (multiple values allowed)
-m, --minor-only Show only packages that have minor SemVer-compatible updates. Use with the --outdated option.
--patch-only Show only packages that have patch SemVer-compatible updates. Use with the --outdated option.
-D, --direct Shows only packages that are directly required by the root package
--strict Return a non-zero exit code when there are outdated packages
-f, --format=FORMAT Format of the output: text or json [default: "text"]
--no-dev Disables search in require-dev packages.
--ignore-platform-req=IGNORE-PLATFORM-REQ Ignore a specific platform requirement (php & ext- packages). Use with the --outdated option (multiple values allowed)
--ignore-platform-reqs Ignore all platform requirements (php & ext- packages). Use with the --outdated option
-h, --help Display help for the given command. When no command is given display help for the list command
-q, --quiet Do not output any message
-V, --version Display this application version
--ansi|--no-ansi Force (or disable --no-ansi) ANSI output
-n, --no-interaction Do not ask any interactive question
--profile Display timing and memory usage information
--no-plugins Whether to disable plugins.
--no-scripts Skips the execution of all scripts defined in composer.json file.
-d, --working-dir=WORKING-DIR If specified, use the given directory as working directory.
--no-cache Prevent use of the cache
-v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
Help:
The show command displays detailed information about a package, or
lists all packages available.
Read more at https://getcomposer.org/doc/03-cli.md#show
root@~:#
还有 create-project
命令:
root@~:# composer create-project -h
Description:
Creates new project from a package into given directory.
Usage:
create-project [options] [--] [<package> [<directory> [<version>]]]
Arguments:
package Package name to be installed
directory Directory where the files should be created
version Version, will default to latest
Options:
-s, --stability=STABILITY Minimum-stability allowed (unless a version is specified).
--prefer-source Forces installation from package sources when possible, including VCS information.
--prefer-dist Forces installation from package dist (default behavior).
--prefer-install=PREFER-INSTALL Forces installation from package dist|source|auto (auto chooses source for dev versions, dist for the rest).
--repository=REPOSITORY Add custom repositories to look the package up, either by URL or using JSON arrays (multiple values allowed)
--repository-url=REPOSITORY-URL DEPRECATED: Use --repository instead.
--add-repository Add the custom repository in the composer.json. If a lock file is present it will be deleted and an update will be run instead of install.
--dev Enables installation of require-dev packages (enabled by default, only present for BC).
--no-dev Disables installation of require-dev packages.
--no-custom-installers DEPRECATED: Use no-plugins instead.
--no-scripts Skips the execution of all scripts defined in composer.json file.
--no-progress Do not output download progress.
--no-secure-http Disable the secure-http config option temporarily while installing the root package. Use at your own risk. Using this flag is a bad idea.
--keep-vcs Whether to prevent deleting the vcs folder.
--remove-vcs Whether to force deletion of the vcs folder without prompting.
--no-install Whether to skip installation of the package dependencies.
--ignore-platform-req=IGNORE-PLATFORM-REQ Ignore a specific platform requirement (php & ext- packages). (multiple values allowed)
--ignore-platform-reqs Ignore all platform requirements (php & ext- packages).
--ask Whether to ask for project directory.
-h, --help Display help for the given command. When no command is given display help for the list command
-q, --quiet Do not output any message
-V, --version Display this application version
--ansi|--no-ansi Force (or disable --no-ansi) ANSI output
-n, --no-interaction Do not ask any interactive question
--profile Display timing and memory usage information
--no-plugins Whether to disable plugins.
-d, --working-dir=WORKING-DIR If specified, use the given directory as working directory.
--no-cache Prevent use of the cache
-v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
Help:
The create-project command creates a new project from a given
package into a new directory. If executed without params and in a directory
with a composer.json file it installs the packages for the current project.
You can use this command to bootstrap new projects or setup a clean
version-controlled installation for developers of your project.
php composer.phar create-project vendor/project target-directory [version]
You can also specify the version with the package name using = or : as separator.
php composer.phar create-project vendor/project:version target-directory
To install unstable packages, either specify the version you want, or use the
--stability=dev (where dev can be one of RC, beta, alpha or dev).
To setup a developer workable version you should create the project using the source
controlled code by appending the '--prefer-source' flag.
To install a package from another repository than the default one you
can pass the '--repository=https://myrepository.org' flag.
Read more at https://getcomposer.org/doc/03-cli.md#create-project
root@~:#
根据指定版本创建项目,如:
> composer create-project --prefer-dist yiisoft/yii2-app-advanced=2.0.45 yii2_220929
项目中使用
在项目指定目录下新建 composer.json 文件,写入依赖的包,如:
{
"require": {
"php": ">=7.0.0",
"yiisoft/yii2": "~2.0.15",
"nmred/kafka-php": "0.2.*",
"peachpear/pear-leaf": "1.0.*"
}
}
然后cd到该层目录下执行 composer install
,就进入自动安装,安装完成后会生成一个 composer.lock
文件,
里面是特定的版本号名,需要把这个文件和 composer.json
一起提交到版本管理里去。
另外composer install
后会在项目根目录下生成 vendor文件夹,并把依赖包全部安装到该 vendor目录下。
第三方下载了项目包,该包中有 composer.lock
文件,执行 composer install
,会安装 composer.lock
文件锁定版本号的相关依赖包,
可以自动排除已安装的依赖包,只下载未安装的依赖包。
更新依赖
在 composer.lock 文件存在时,想更新依赖包的更高版本,可以使用 update 命令。 这将获取最新匹配的版本(根据你的 composer.json 文件)并将新版本更新进锁文件。
更新依赖:
composer update
如果只想更新部分依赖:
composer update peachpear/pear-leaf
在 composer.json 文件新加了包,可以使用install命令安装新增的包(composer足够智能,可以判断出哪些还没有安装):
composer install
安装完成后,会在 composer.lock 文件中写入包的版本等信息。
移除依赖
移除指定依赖:
composer remove yiisoft/yii2
不过这只是删除了依赖关系,不会自动加载,但其依赖包还在vender文件夹里,可手动删除。
版本说明
版本格式:主版本号.次版本号.修订号,版本号递增规则如下:
主版本号:当你做了不兼容的 API 修改,
次版本号:当你做了向下兼容的功能性新增,
修订号:当你做了向下兼容的问题修正。
先行版本号及版本编译元数据可以加到“主版本号.次版本号.修订号”的后面,作为延伸。
使用 ~
约束符锁定小版本的方式, 使用 ^
约束符锁定大版本
~表示版本号只能改变最末尾那段(如果是 ~x.y 末尾就是 y,如果是 ~x.y.z 末尾就是 z)
~1.2.3 代表 1.2.3 <= 版本号 < 1.3.0
~1.2 代表 1.2 <= 版本号 <2.0
^表示除了大版本号以外,小版本号和补丁版本号都可以变
^1.2.3 代表 1.2.3 <= 版本号 < 2.0.0
特殊情况0开头的版本号:
^0.3.0 等于 0.3.0 <= 版本号 <0.4.0 注意:不是 <1.0.0
因为:semantic versioning 的规定是,大版本号以 0 开头表示这是一个非稳定版本(unstable),
如果处于非稳定状态,小版本号是允许不向下兼容的,
所以如果你要指定 0 开头的库那一定要注意:
危险写法:~0.1 等于 0.1.0 <= 版本号 <1.0.0
保险写法:^0.1 等于 0.1.0 <= 版本号 <0.2.0
锁定版本范围:
有时候我们的使用场景要求只能安装某些版本范围内的时候,可以使用 >、<、>=、<=、|
这些符号来组合,
比如:>= 1.3 <1.6、>=1.3 | >=1.7 、3.0|4.0
等。
这样的使用场景并不多,根据你的情况来调整用法就好。
init初始化
在一个项目中,可以使用 composer init
进行项目初始化:
root@02891538d8c9:/var/www/html/test# composer init
The "fxp/composer-asset-plugin" plugin was skipped because it requires a Plugin API version ("^1.0") that
does not match your Composer installation ("2.3.0"). You may need to run composer update with the "--no-plugins" option.
Welcome to the Composer config generator
This command will guide you through creating your composer.json config.
Package name (<vendor>/<name>) [root/test]: test/test
Description []: test
Author [n to skip]: test
Minimum Stability []: 0.0.1
Invalid minimum stability "0.0.1". Must be empty or one of: stable, RC, beta, alpha, dev
Minimum Stability []: dev
Package Type (e.g. library, project, metapackage, composer-plugin) []: project
License []: PSL
Define your dependencies.
Would you like to define your dependencies (require) interactively [yes]? no
Would you like to define your dev dependencies (require-dev) interactively [yes]? no
Add PSR-4 autoload mapping? Maps namespace "Test\Test" to the entered relative path. [src/, n to skip]: yes
The src folder name "yes" is invalid. Please add a relative path with tailing forward slash. [A-Za-z0-9_-/]+/
Add PSR-4 autoload mapping? Maps namespace "Test\Test" to the entered relative path. [src/, n to skip]: src/
{
"name": "test/test",
"description": "test",
"type": "project",
"license": "PSL",
"autoload": {
"psr-4": {
"Test\\Test\\": "src/"
}
},
"authors": [
{
"name": "test"
}
],
"minimum-stability": "dev",
"require": {}
}
Do you confirm generation [yes]? yes
The "fxp/composer-asset-plugin" plugin (installed globally) was skipped because it
requires a Plugin API version ("^1.0") that does not match your Composer installation ("2.3.0").
You may need to run composer update with the "--no-plugins" option.
Generating autoload files
Generated autoload files
PSR-4 autoloading configured. Use "namespace Test\Test;" in src/
Include the Composer autoloader with: require 'vendor/autoload.php';
root@02891538d8c9:/var/www/html/test#
root@02891538d8c9:/var/www/html/test#
prefer
有时在用 composer 安装项目时会看到类似这样的命令:
composer create-project --prefer-dist yiisoft/yii2-app-basic blog
--prefer-dist
的作用是什么?
composer 有两个这样的参数 --prefer-dist
和 --prefer-source
:
-
--prefer-dist
会从github 上下载.zip
压缩包,并缓存到本地。下次再安装就会从本地加载,大大加速安装速度。 但它没有保留.git
文件夹,没有版本信息。适合基于这个 package 进行开发。 -
--prefer-source
会从github 上clone 源代码,不会在本地缓存。但她保留了.git
文件夹, 从而可以实现版本控制。适合用于修改源代码。
推荐使用--prefer-dist
可以加快速度,在使用的时候有可能会有下面类似的警告:
Failed to download yiisoft/yii2-gii from dist: The zip extension and unzip command are both missing, skipping.
Your command-line PHP is using multiple ini files. Run `php --ini` to show them.
环境中缺少zip、unzip工具包,安装一下:
apt-get install zip unzip
no-dev
如何在开发环境和生产环境中下载不同的依赖包?
在开发测试与生产部署阶段引用不同的依赖包,以 phpunit/phpunit包 为例。
1)在本地环境中下载测试的开发包使用以下命令:
composer require --dev phpunit/phpunit
--dev
安装require-dev
部分的依赖包,是composer的默认值。
2)在生产环境中不使用测试的开发包,使用以下命令会跳过dev的开发包:
composer install --no-dev
如composer.json
文件中有:
"require": {
"php": ">=7.3",
"ext-swoole": ">=4.4"
},
"require-dev": {
"phpunit/phpunit": "^8.5.8|^9.3.3",
"swoole/ide-helper": "^4.6",
"phpmd/phpmd": "^2.6"
}
使用--no-dev
使用则不会下载require-dev
部分的依赖包。
plugins
--no-plugins
:composer安装依赖包时关闭 plugins 插件。
如:
composer update yiisoft/yii2-composer --no-plugins
有时在不使用--no-plugins
更新composer插件时会提示:
The “yiisoft/yii2-composer” plugin was skipped because it requires a Plugin API version (“^1.0”) that
does not match your Composer installation (“2.1.0”)。这时就可以使用上面的命令。
插件是一种可扩展的应用程序,通过向主应用程序添加额外的功能或模块,以扩展其功能和用途。 插件通常是由第三方开发者编写的,用于满足特定的需求或扩展主应用程序的功能。 插件可以增强主应用程序的性能、功能和用户体验,但也可能导致与主应用程序的兼容性问题或冲突。
依赖包则是项目运行所需的外部库或框架,通常由第三方开发者提供。依赖包用于实现项目中的特定功能或模块, 可以包括框架、库、工具或插件等。依赖包需要通过 Composer 等依赖管理工具进行安装和管理, 以确保项目在运行时能够正确加载和使用这些库和框架。
因此,插件和依赖包在作用和特性上有所不同。插件主要用于扩展应用程序的功能和用途, 而依赖包则用于实现项目中的特定功能或模块,并需要在项目运行前进行安装和管理。
dump-autoload
dump-autoload 是 Composer 的一个命令行工具,用于生成自动加载文件。
由于开发项目的使用会使用很多第三方的开发包,当引用过多的第三方开发包的使用,
有的类在 vendor\composer 目录下自动加载会存在找不到的情况,
这时候重新运行下composer dump-autoload
命令会重新生成自动加载的所有文件。
有时在项目的根目录下新建了一个 app的文件夹 用来写逻辑,里面定义的命令空间是App,这时就可以在composer.json
文件中写:
"autoload": {
"psr-4": {
"App\\": "./app/"
}
}
然后使用 composer dump-autoload
命令 在vendor/composer/autoload_psr4.php
文件中中把命名空间与路径的对照关系写入进去。
可以使用spl_autoload_register()
作为dump-autoload的安全替代,如下:
spl_autoload_register(function ($class_name){
$file_name = database_path("seeds/{Sclass_name}.php");
if (is_file($file_name)){
require_once $file_name;
)
)};
clearcache
composer clearcache
清楚本地依赖包缓存,后续安装时从远程仓库获取最新依赖包。
repositories
一般项目的 repositories 如下:
"repositories": {
"packagist": {
"type": "composer",
"url": "https://mirrors.aliyun.com/composer/"
}
}
但 fastadmin 中的居然是:
"repositories": [
{
"type": "git",
"url": "https://gitee.com/fastadminnet/framework.git"
},
{
"type": "git",
"url": "https://gitee.com/fastadminnet/think-captcha.git"
}
]
如果没有git环境会报错:
root@02891538d8c9:/var/www/html/fastadmin# composer install --no-plugins --optimize-autoloader --no-dev
No composer.lock file present. Updating dependencies to latest instead of installing from lock file. See https://getcomposer.org/install for more information.
Loading composer repositories with package information
In Git.php line 470:
Failed to clone https://gitee.com/fastadminnet/framework.git, git was not found, check that it is installed and in your PATH env.
sh: 1: git: not found
install [--prefer-source] [--prefer-dist] [--prefer-install PREFER-INSTALL] [--dry-run] [--download-only] [--dev] [--no-suggest] [--no-dev] [--no-autoloader] [--no-progress] [--no-install] [--audit] [--audit-format AUDIT-FORMAT] [-v|vv|vvv| --verbose] [-o|--optimize-autoloader] [-a|--classmap-authoritative] [--apcu-auto loader] [--apcu-autoloader-prefix APCU-AUTOLOADER-PREFIX] [--ignore-platform-req IGNORE-PLATFORM-REQ] [--ignore-platform-reqs] [--] [<packages>...]
root@02891538d8c9:/var/www/html/fastadmin# git --version
bash: git: command not found
root@02891538d8c9:/var/www/html/fastadmin#
说明
Composer 的 repositories
是一个配置选项,它在 composer.json
文件中定义,用于指定 Composer 查找 PHP 包的位置。
这些位置被称为“资源库”(repositories),它们可以是各种类型的代码托管服务,如 Packagist、Git、SVN 等。
Packagist
Packagist 类型是 Composer 默认的包仓库类型,用于从 Packagist 网站(https://packagist.org/)上查找和安装 PHP 软件包。 Packagist 是一个流行的 PHP 软件包分发平台,由 Composer 官方维护,它提供了丰富的 PHP 包资源,并允许开发者搜索、安装、使用和贡献他们的代码。
以下是关于 Packagist 类型的详细解释:
- 默认设置:
- 在
composer.json
文件中,通常不需要明确指定 Packagist 作为仓库类型,因为 Composer 默认就会从 Packagist 查找软件包。
- 在
- 功能特点:
- 搜索:Packagist 提供了强大的搜索功能,允许开发者根据关键字、标签、作者等信息查找软件包。
- 版本管理:Packagist 支持多版本的软件包,允许开发者根据项目的需求选择特定的软件包版本。
- 社区支持:Packagist 拥有一个庞大的开发者社区,开发者可以在上面发布自己的软件包,并获取其他开发者的反馈和支持。
- 使用方式:
- 当你在
composer.json
文件的require
部分指定一个软件包时(例如"monolog/monolog": "^2.0"
),Composer 会自动从 Packagist 查找并安装该软件包及其依赖项。
- 当你在
- 自定义 Packagist 仓库:
- 尽管 Composer 默认使用官方的 Packagist 仓库,但你也可以配置 Composer 使用自定义的 Packagist 仓库。这通常用于私有项目或内部软件包的分发。
- 在
composer.json
文件的repositories
部分,你可以添加一个composer
类型的仓库,并指定其 URL。例如:"repositories": [ { "type": "composer", "url": "https://your-private-packagist.com" } ]
- 安全性:
- 官方维护
- HTTPS支持
- 访问控制
- 包签名
- 安全审计和监控
- 依赖管理
- 更新通知
- 社区支持
- 最佳实践
Git 类型
关于 repositories
中的 Git 类型,以下是详细的解释:
- Git 类型的 repositories:
- 当 Composer 需要从非 Packagist 的位置获取 PHP 包时,可以使用 Git 类型的 repositories。这通常发生在以下情况:
- 当你需要从一个私有的 Git 仓库中获取包时。
- 当你需要从一个特定的 Git 分支或标签中获取包时。
- 在
composer.json
文件中,Git 类型的 repositories 可以这样定义:"repositories": [ { "type": "git", "url": "https://github.com/your-username/your-repository.git" } ]
- 如果 Git 仓库需要身份验证(如私有仓库),则可以在项目的根目录下(与
composer.json
平级的目录)创建一个auth.json
文件来存储凭据,如用户名和密码或 SSH 密钥。
- 当 Composer 需要从非 Packagist 的位置获取 PHP 包时,可以使用 Git 类型的 repositories。这通常发生在以下情况:
- 为什么使用 Git 类型的 repositories:
- 速度:有时,从私有的 Git 仓库获取包比从 Packagist 或其他远程服务更快,特别是对于内部开发或特定项目。
- 控制:Git 类型的 repositories 允许你精确地指定从哪个分支、标签或提交中获取包,这给了你更大的灵活性。
- 私有性:对于私有项目或内部库,你可能不希望将它们发布到公共的包存储库(如 Packagist),而是希望将它们托管在私有的 Git 仓库中。
- 其他类型的 repositories:
- 除了 Git 之外,Composer 还支持其他类型的 repositories,如
composer
(用于其他 Composer 仓库)、vcs
(用于版本控制系统,如 Git、SVN 等)、package
(用于直接定义包信息)等。
- 除了 Git 之外,Composer 还支持其他类型的 repositories,如
- 注意事项:
- 当在
composer.json
中定义多个 repositories 时,Composer 会按照它们在数组中的顺序进行查找。因此,如果你的项目依赖包既存在于 Packagist 又存在于一个 Git 仓库中,并且你希望从 Git 仓库中获取它,你需要确保 Git 仓库的定义在 Packagist 之前。 - 使用 Git 类型的 repositories 时,确保你的 Git 仓库符合 Composer 的要求,包括包含一个有效的
composer.json
文件。
- 当在
VCS类型
VCS(版本控制系统)类型在 Composer 的上下文中并不直接指代一个特定的包仓库类型,而是指版本控制软件或系统的总称。然而,当在 Composer 的 composer.json
文件中提及 VCS(或 vcs
类型)时,它通常用于指定 Composer 如何从一个版本控制系统(如 Git、SVN 等)中拉取软件包。
以下是关于 VCS 类型在 Composer 上下文中使用的详细解释和归纳:
- VCS 类型的作用
- 指定非标准仓库:当 Composer 需要从一个非 Packagist 的版本控制系统中获取软件包时,可以使用
vcs
类型来指定仓库的 URL 和其他必要信息。 - 支持多种 VCS:
vcs
类型支持多种版本控制系统,如 Git、SVN 等。这意味着你可以从任何这些系统中拉取软件包。
- 指定非标准仓库:当 Composer 需要从一个非 Packagist 的版本控制系统中获取软件包时,可以使用
-
使用 VCS 类型的配置示例
在
composer.json
文件的repositories
部分,你可以使用vcs
类型来指定一个版本控制系统的仓库,例如:"repositories": [ { "type": "vcs", "url": "https://github.com/your-username/your-private-package.git" } ]
-
VCS 类型的优势
- 灵活性:使用 VCS 类型允许你从任何版本控制系统中拉取软件包,而不仅仅是 Packagist。
- 控制:你可以精确地指定从哪个分支、标签或提交中获取软件包,这给了你更大的灵活性。
- 私有性:对于私有项目或内部库,你可以将它们托管在私有的版本控制系统中,并通过 VCS 类型在 Composer 中引用它们。
-
注意事项
- 身份验证:如果版本控制系统需要身份验证(如私有 Git 仓库),你需要在 Composer 的配置中提供凭据或使用其他机制(如 SSH 密钥)进行身份验证。
- 性能:从版本控制系统中拉取软件包可能比从包仓库(如 Packagist)中拉取更慢,因为版本控制系统可能需要执行额外的操作(如克隆仓库)。
- 学习成本:使用 VCS 类型可能需要你熟悉所选版本控制系统的基本概念和命令。
-
总结
VCS 类型在 Composer 中用于指定如何从版本控制系统中拉取软件包。它提供了灵活性、控制和私有性,但也可能带来性能下降和学习成本的增加。 通过正确配置和使用 VCS 类型,你可以确保 Composer 能够从任何版本控制系统中可靠地获取所需的软件包。
SVN类型
在 Composer 的上下文中,svn
类型用于指定 Composer 如何从一个 Subversion(SVN)版本控制系统中拉取软件包。以下是关于 svn
类型的详细解释和归纳:
-
svn 类型的作用
- 拉取 SVN 仓库中的软件包:允许 Composer 从指定的 SVN 仓库 URL 拉取软件包,这对于那些使用 SVN 进行版本控制的私有或特定项目特别有用。
-
svn 类型的配置
在
composer.json
文件的repositories
部分,你可以指定一个svn
类型的仓库,如下例所示:"repositories": [ { "type": "svn", "url": "https://your-svn-server.com/svn/your-package/trunk", "trunk-path": "trunk", "branches-path": "branches/*", "tags-path": "tags/*" } ]
- url:SVN 仓库的 URL。
- trunk-path:可选,指向主干(trunk)的路径。默认为 “trunk”。
- branches-path:可选,指向分支的路径模式。默认为 “branches/*“。
- tags-path:可选,指向标签的路径模式。默认为 “tags/*“。
-
svn 类型的注意事项
- 认证:如果 SVN 仓库需要认证(如用户名和密码),你可能需要在 Composer 的配置中提供这些信息或使用其他机制(如 SSH 密钥)进行身份验证。
- 性能:从 SVN 仓库中拉取软件包可能比从其他类型的仓库(如 Git 或 Packagist)中拉取更慢,因为 SVN 可能需要执行额外的操作。
- 版本控制:确保你的 SVN 仓库已经设置了正确的分支和标签结构,以便 Composer 能够正确地识别不同的版本。
-
总结
svn
类型允许 Composer 从 SVN 仓库中拉取软件包,提供了对使用 SVN 进行版本控制的项目的支持。通过正确配置composer.json
文件中的repositories
部分,你可以指定 SVN 仓库的 URL 和其他相关选项。然而,需要注意认证、性能和版本控制等潜在问题。
期间问题
bower插件问题
期间发现一个问题,Yii2安装时需要 bower-asset/jquery 3.4.*@stable
:
需要引入 bower-asset/jquery
,有两种方式:
// 全局安装
composer global require "fxp/composer-asset-plugin"
// 或者项目内引入
composer require --dev "fxp/composer-asset-plugin"
如果全局安装没效果,就项目内引入。
期间又发现另外一个问题,GitHub OAuth token or enter a new one to go over the API rate limit 。
提示中说明了获取地址: https://github.com/settings/tokens/new?scopes=repo&description=Composer+on+pc+2019-11-14+1145
。
我们通过浏览器打开,发现是生成token页面,选项也默认选择了,我们只要点击下方的确认就可以。
复制生成的token.在刚才执行的命令行中要token的地方粘贴并回车:
可以看到终于把所有依赖包都安装完毕。
composer版本问题
composer install
时报错:
Package fxp/composer-asset-plugin has a PHP requirement incompatible with your PHP
-
一个可能原因是因为 composer版本低了,如composer1.0.0的Package fxp/composer-asset-plugin与PHP版本(7.2.0)不兼容。
-
另一个可能原因是 composer包版本高了,我们到 packagist 中 查看fxp/composer-asset-plugin的环境要求:
v1.4.6 2019-08-08 18:36 UTC
Requires
php: >=5.3.3
composer-plugin-api: ^1.0
Requires (Dev)
composer/composer: ^1.6.0
如果我们的 composer 是 2.x 版本,那就卸载 composer 。
我们只要把composer文件移除就可以:
[root@BaiYang-PC src]# rm -f /usr/local/bin/composer
或者降级到版本1 composer self-update --1
安装指定版本的 Composer:
[root@BaiYang-PC src]#
[root@BaiYang-PC src]# php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
[root@BaiYang-PC src]# php composer-setup.php --version=1.6.5
All settings correct for using Composer
Downloading...
Composer (version 1.6.5) successfully installed to: /usr/local/src/composer.phar
Use it: php composer.phar
[root@BaiYang-PC src]#
[root@BaiYang-PC src]#
[root@BaiYang-PC src]# mv composer.phar /usr/local/bin/composer
[root@BaiYang-PC src]#
安装 fxp/composer-asset-plugin 前端资源管理插件:
[root@BaiYang-PC src]# composer global require "fxp/composer-asset-plugin:~1.4"
Changed current directory to /root/.composer
Warning from https://packagist.org: Support for Composer 1 is deprecated and some packages will not be available.
You should upgrade to Composer 2. See https://blog.packagist.com/deprecating-composer-1-support/
^C
[root@BaiYang-PC src]#
命令行停滞在这了,说 composer1 被抛弃了,已经不可使用了。看来 fxp/composer-asset-plugin 这个插件包是没办法安装使用了。
更新 composer :
[root@BaiYang-PC src]# composer self-update
如果是安装Yii2需要 fxp/composer-asset-plugin 管理asset前端资源,我们可以按照 Yii2说明文档:
您可能希望通过本地 Bower/NPM 客户端管理您的 assets,使用 CDN 或完全避免 assets 的安装。
为了防止通过 Composer 安装 assets,请将以下几行添加到您的 'composer.json' 中:
"replace": {
"bower-asset/jquery": ">=1.11.0",
"bower-asset/inputmask": ">=3.2.0",
"bower-asset/punycode": ">=1.3.0",
"bower-asset/yii2-pjax": ">=2.0.0"
},
SSL证书问题
https://blog.csdn.net/w670328683/article/details/53442087
解惑
fxp/composer-asset-plugin 是什么
可以先参阅下 https://www.yiichina.com/doc/guide/2.0/structure-assets
fxp/composer-asset-plugin 是 Composer 的 NPM/Bower 依赖管理器。
2017 年 4 月份,也就是 yii2 的 2.0.12 版本中用 Asset Packagist 插件替换了 fxp/composer-asset-plugin。 所以,如果你用的是 yii2 2.0.12 及更新版本则不会遇到问题: 为什么基于 Yii2 创建的项目安装依赖包时即便设置了中国镜像依然很慢? 但是你会遇到下一个问题:为什么不为 Asset Packagist 创建中国镜像?
yii2 通过 fxp/composer-asset-plugin 插件来安装前端开发所用到依赖包, 此插件会在安装完 php 依赖包之后再安装前端开发所依赖的 npm 或 bower 包, 但是,此插件默认行为是前往 Github 下载资源,从而绕开了中国镜像。 这就是为什么基于 Yii2 创建的项目安装依赖包时即便设置了中国镜像依然很慢的原因。
fxp/composer-asset-plugin 使用中国镜像来安装前端开发所用到依赖包。使用前需要先用 Composer 安装 fxp/composer-asset-plugin :
composer global require “fxp/composer-asset-plugin”
卸载可以用:
composer global remove “fxp/composer-asset-plugin”
如:
root@02891538d8c9:/usr/local/src# composer global require "fxp/composer-asset-plugin"
Changed current directory to /root/.composer
Warning from https://repo.packagist.org: Support for Composer 1 is deprecated and some packages will not be available. You should upgrade to Composer 2. See https://blog.packagist.com/deprecating-composer-1-support/
Info from https://repo.packagist.org: #StandWithUkraine
Using version ^1.4 for fxp/composer-asset-plugin
./composer.json has been updated
Loading composer repositories with package information
Warning from https://repo.packagist.org: Support for Composer 1 is deprecated and some packages will not be available. You should upgrade to Composer 2. See https://blog.packagist.com/deprecating-composer-1-support/
Info from https://repo.packagist.org: #StandWithUkraine
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
- Installing fxp/composer-asset-plugin (v1.4.6): Downloading (100%)
Writing lock file
Generating autoload files
root@02891538d8c9:/usr/local/src#
root@02891538d8c9:/usr/local/src# cd ~
root@02891538d8c9:~#
root@02891538d8c9:~# composer global remove "fxp/composer-asset-plugin"
Changed current directory to /root/.composer
The "fxp/composer-asset-plugin" plugin was skipped because it requires a Plugin API version ("^1.0") that does not match your Composer installation ("2.3.0"). You may need to run composer update with the "--no-plugins" option.
./composer.json has been updated
The "fxp/composer-asset-plugin" plugin was skipped because it requires a Plugin API version ("^1.0") that does not match your Composer installation ("2.3.0"). You may need to run composer update with the "--no-plugins" option.
Running composer update fxp/composer-asset-plugin
Loading composer repositories with package information
Updating dependencies
Lock file operations: 0 installs, 0 updates, 1 removal
- Removing fxp/composer-asset-plugin (v1.4.6)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 0 installs, 0 updates, 1 removal
- Removing fxp/composer-asset-plugin (v1.4.6)
Generating autoload files
root@02891538d8c9:~#
Asset Packagist 是什么
Asset Packagist 这个仓库可以让 npm 和 bower 包作为 composer 原生包安装。
不需要插件,不需要Node.js。
我们已经添加了常用的 npm 和 bower 包。
搜索技巧:
- Npm库中不带有 scope 方式命名的包, 如
jquery
用npm-asset/jquery
代替进行精准搜索。 - Npm库中以 scope 方式命名的包,将原生命名
@scope/package
替换成scope--package
格式进行搜索, 如.npm-asset/pusher--chatkit
.
用法
用以下方法添加包:
"require": {
"bower-asset/bootstrap": "^3.3",
"npm-asset/jquery": "^2.2"
}
然后加入以下行:
"repositories": {
{
"type": "composer",
"url": "https://asset-packagist.cn"
}
}
为什么要建这个仓库
fxp/composer-asset-plugin 用起来让人恼火。
它是一个非常有创意的项目,也是一个好的实现。
但是它有一些问题:当使用 composer update
时非常缓慢,而且需要全局安装一个插件, 这会影响所有项目。
与此同时,Travis 和 Scrutinizer 联合使用中也会有些奇葩问题, 令人抓狂。
工作原理
Asset Packagist 提供关于Bower和NPM包的信息,类似于Packagist为Composer包的信息。
因此,当您在启用资源包(Asset Package)的项目中运行composer,composer知道bower-asset和npm-asset包的所有可用版本, 并知道如何下载它们的文件。
首先将 Bower 和 NPM 包 加入到我们自己的仓库中. 脚本会收集包信息并且以Packagist的格式处理json文件。
该文件包含了该包的所有版本的说明,格式如下:
"2.13.0.0": {
"uid": 1000600,
"name": "bower-asset/moment",
"version": "2.13.0.0",
"type": "bower-asset",
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/moment/moment/zipball/d6651c21c6131fbb5db891b60971357739015688",
"reference": "d6651c21c6131fbb5db891b60971357739015688"
},
"source": {
"type": "git",
"url": "https://github.com/moment/moment.git",
"reference": "d6651c21c6131fbb5db891b60971357739015688"
}
},
所以,当您运行composer时,它会下载Asset Packagist 库提供的包信息,然后 Composer 解析依赖项并找到所需包的正确版本, 然后将包文件下载到项目的vendor目录中(实际上composer并不关心这些文件是PHP还是JS或其他文件)。
所有的JSON文件都作为静态文件存储在 Asset Packagist 端, 项目中 Composer 会有效的找到这些文件,这样一切都能尽快完成。
安装到自定义路径
Asset Packagist 不是插件,所以他不受 Composer的包安装位置所限制。
默认 bower-asset/bootstrap
包将会安装到 vendor/bower-asset/bootstrap
目录中。
你可以通过 oomphinc/composer-installers-extender
插件,来自定义安装路径,如:
"require": {
"oomphinc/composer-installers-extender": "^1.1",
"bower-asset/bootstrap": "^3.3",
"npm-asset/jquery": "^2.2"
},
"extra": {
"installer-types": ["bower-asset", "npm-asset"],
"installer-paths": {
"public/assets/{$vendor}/{$name}/": ["type:bower-asset", "type:npm-asset"]
}
},
"repositories": [
{
"type": "composer",
"url": "https://asset-packagist.cn"
}
]
Yii2
Yii2 默认会将 Bower 和 NPM 包 分别安装到 vendor/bower
和 vendor/npm
目录中。
因此,在Yii2项目中引用 asset-packagist,必须在程序的配置文件中重新指定 Bower 和 NPM 别名的映射,如:
$config = [
...
'aliases' => [
'@bower' => '@vendor/bower-asset',
'@npm' => '@vendor/npm-asset',
],
...
];
从 composer-asset-plugin 迁移
在同一台服务器中运行了多个应用时,从 composer-asset-plugin 迁移是个麻烦事。 你需要注意:当这个插件在全局安装时,asset packagist 与 asset plugin 同时存在会有冲突。 所以,为了不影响其他应用的情况下停掉这个插件, 你可以通过在 composer.json 文件中的 config 选项中禁用掉这个插件(你的 plugin 版本需要 ≥ 1.3.0 ):
"config": {
"fxp-asset": {
"enabled": false
}
}
为什么不为 Asset Packagist 创建中国镜像?
首先,Asset Packagist 的目的也是为了解决在 php 项目中安装前端模块的问题, 其通过转换 npm / bower 模块并创建一个类似 packagist 的服务为前端模块提供依赖解析和下载。
yii2 2.0 版本发布于 2014 年,所以有着历史原因,然而随着 Node.js / npm 生态的完善和普及, Asset Packagist 这种方式显得很笨拙,对前端开发没有任何益处,yii2 采用这种方式也只是为了向后兼容, 避免破坏现有框架的工作方式而已。
Asset Packagist 的存在意义已经很弱了,新的框架(例如 Laravel)对前端开发的支持直接构建在 npm 上的, 因此,Asset Packagist 镜像的存在的意义也很弱,中国区就没有为其提供镜像。
参考资料
Composer 官网 https://www.phpcomposer.com/
Composer 文档 https://docs.phpcomposer.com/
中国镜像官网 https://pkg.phpcomposer.com/
中国全量镜像 https://pkg.xyz/
fxp/composer-asset-plugin https://github.com/fxpio/composer-asset-plugin
Asset Packagist 官网 https://asset-packagist.org/
Asset Packagist 中文站 https://asset-packagist.cn/
Linux 下安装Composer https://ibaiyang.github.io/blog/linux/2017/07/25/Linux-下安装Composer.html
Composer —— A Dependency Manager for PHP https://getcomposer.org/
基本用法 - Composer 中文文档 - Composer 中文网 https://docs.phpcomposer.com/01-basic-usage.html
fxp/composer-asset-plugin https://packagist.org/packages/fxp/composer-asset-plugin#v1.0.3
语义化版本 2.0.0 https://semver.org/lang/zh-CN/
composer 版本号前置~与^符号的区别 https://blog.csdn.net/eebaicai/article/details/88047833
Composer安装和使用 https://www.jianshu.com/p/256547b495c2
composer.json 中的各个属性字段详解 https://blog.zzstudio.net/bs/article_1098.html
yii2 composer 下载扩展解决jquery版本错误 https://blog.csdn.net/wpj130/article/details/88743232
YII2 composer update 报错解决一例-requires bower-asset/jquery 2.2 https://www.cnblogs.com/rxbook/p/11043900.html
PHP 开发者该知道的 5 个 Composer 小技巧 https://www.phpcomposer.com/5-features-to-know-about-composer-php/
Composer 安装与使用 https://www.runoob.com/w3cnote/composer-install-and-usage.html
Composer 出现error:14090086的解决方案 https://blog.csdn.net/w670328683/article/details/53442087
packages fxp/composer-asset-plugin http://packagist.p2hp.com/packages/fxp/composer-asset-plugin