Composer 使用说明


Composer 使用说明


正文

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 类型的详细解释:

  1. 默认设置
    • composer.json 文件中,通常不需要明确指定 Packagist 作为仓库类型,因为 Composer 默认就会从 Packagist 查找软件包。
  2. 功能特点
    • 搜索:Packagist 提供了强大的搜索功能,允许开发者根据关键字、标签、作者等信息查找软件包。
    • 版本管理:Packagist 支持多版本的软件包,允许开发者根据项目的需求选择特定的软件包版本。
    • 社区支持:Packagist 拥有一个庞大的开发者社区,开发者可以在上面发布自己的软件包,并获取其他开发者的反馈和支持。
  3. 使用方式
    • 当你在 composer.json 文件的 require 部分指定一个软件包时(例如 "monolog/monolog": "^2.0"),Composer 会自动从 Packagist 查找并安装该软件包及其依赖项。
  4. 自定义 Packagist 仓库
    • 尽管 Composer 默认使用官方的 Packagist 仓库,但你也可以配置 Composer 使用自定义的 Packagist 仓库。这通常用于私有项目或内部软件包的分发。
    • composer.json 文件的 repositories 部分,你可以添加一个 composer 类型的仓库,并指定其 URL。例如:
      "repositories": [
          {
              "type": "composer",
              "url": "https://your-private-packagist.com"
          }
      ]
      
  5. 安全性
    • 官方维护
    • HTTPS支持
    • 访问控制
    • 包签名
    • 安全审计和监控
    • 依赖管理
    • 更新通知
    • 社区支持
    • 最佳实践

Git 类型

关于 repositories 中的 Git 类型,以下是详细的解释:

  1. 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 密钥。
  2. 为什么使用 Git 类型的 repositories
    • 速度:有时,从私有的 Git 仓库获取包比从 Packagist 或其他远程服务更快,特别是对于内部开发或特定项目。
    • 控制:Git 类型的 repositories 允许你精确地指定从哪个分支、标签或提交中获取包,这给了你更大的灵活性。
    • 私有性:对于私有项目或内部库,你可能不希望将它们发布到公共的包存储库(如 Packagist),而是希望将它们托管在私有的 Git 仓库中。
  3. 其他类型的 repositories
    • 除了 Git 之外,Composer 还支持其他类型的 repositories,如 composer(用于其他 Composer 仓库)、vcs(用于版本控制系统,如 Git、SVN 等)、package(用于直接定义包信息)等。
  4. 注意事项
    • 当在 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 上下文中使用的详细解释和归纳:

  1. VCS 类型的作用
    • 指定非标准仓库:当 Composer 需要从一个非 Packagist 的版本控制系统中获取软件包时,可以使用 vcs 类型来指定仓库的 URL 和其他必要信息。
    • 支持多种 VCSvcs 类型支持多种版本控制系统,如 Git、SVN 等。这意味着你可以从任何这些系统中拉取软件包。
  2. 使用 VCS 类型的配置示例

    composer.json 文件的 repositories 部分,你可以使用 vcs 类型来指定一个版本控制系统的仓库,例如:

     "repositories": [
         {
             "type": "vcs",
             "url": "https://github.com/your-username/your-private-package.git"
         }
     ]
    
  3. VCS 类型的优势

    • 灵活性:使用 VCS 类型允许你从任何版本控制系统中拉取软件包,而不仅仅是 Packagist。
    • 控制:你可以精确地指定从哪个分支、标签或提交中获取软件包,这给了你更大的灵活性。
    • 私有性:对于私有项目或内部库,你可以将它们托管在私有的版本控制系统中,并通过 VCS 类型在 Composer 中引用它们。
  4. 注意事项

    • 身份验证:如果版本控制系统需要身份验证(如私有 Git 仓库),你需要在 Composer 的配置中提供凭据或使用其他机制(如 SSH 密钥)进行身份验证。
    • 性能:从版本控制系统中拉取软件包可能比从包仓库(如 Packagist)中拉取更慢,因为版本控制系统可能需要执行额外的操作(如克隆仓库)。
    • 学习成本:使用 VCS 类型可能需要你熟悉所选版本控制系统的基本概念和命令。
  5. 总结

    VCS 类型在 Composer 中用于指定如何从版本控制系统中拉取软件包。它提供了灵活性、控制和私有性,但也可能带来性能下降和学习成本的增加。 通过正确配置和使用 VCS 类型,你可以确保 Composer 能够从任何版本控制系统中可靠地获取所需的软件包。

SVN类型

在 Composer 的上下文中,svn 类型用于指定 Composer 如何从一个 Subversion(SVN)版本控制系统中拉取软件包。以下是关于 svn 类型的详细解释和归纳:

  1. svn 类型的作用

    • 拉取 SVN 仓库中的软件包:允许 Composer 从指定的 SVN 仓库 URL 拉取软件包,这对于那些使用 SVN 进行版本控制的私有或特定项目特别有用。
  2. 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/*“。
  3. svn 类型的注意事项

    1. 认证:如果 SVN 仓库需要认证(如用户名和密码),你可能需要在 Composer 的配置中提供这些信息或使用其他机制(如 SSH 密钥)进行身份验证。
    2. 性能:从 SVN 仓库中拉取软件包可能比从其他类型的仓库(如 Git 或 Packagist)中拉取更慢,因为 SVN 可能需要执行额外的操作。
    3. 版本控制:确保你的 SVN 仓库已经设置了正确的分支和标签结构,以便 Composer 能够正确地识别不同的版本。
  4. 总结

    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 方式命名的包, 如jquerynpm-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/bowervendor/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://packagist.org/

中国镜像官网 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


返回