标签: composer

  • Gryen-GTD 升级日志,composer 详解

    Gryen-GTD 升级日志,composer 详解

    许久没有更新过本博客系统了,前些天有朋友想使用本系统搭建自己的博客,发现看着我给的文档根本无从下手,无奈之下我发邮件向我求助。如果对 Linux、PHP、MySQL 等有基本的了解,以目前系统的状态,我也是无能为力的。怪自己懒,更新不及时。Gryen-GTD 更新频率视个人情况,有时更新较为频繁,有时几个月也不会有代码提交。开始此项目时,仅仅作为自己的一个实验,主要帮助自己熟悉 PHP 及周边知识,以免长时间不接触 PHP 的工作后遗忘。做的有点儿样子后,将其开源,希望能借助开源提高一下自己的编程水平,如果有幸能帮到一些朋友或有朋友对此感兴趣,可以共同开发,也算是额外的激励了。

    最近有时间维护下此项目,发现果然遗忘了很多,连 composer 都有点儿搞不懂了。

    Composer

    Composer 是 PHP 的一个依赖管理工具,类比与 Node 的 npm,通常,它会将 packages 安装到项目的 vendor 文件夹中,相当于 npm 的 node_modules。关于它的详细介绍可阅读Composer 中文文档。Composer 常用的命令如下:

    • composer install:如有 composer.lock 文件,会直接安装,否则,它会根据 composer.json 配置文件安装依赖;
    • composer require xxx [--dev]:它会安装xxxpackage,并将其记录到 composer.json 文件中,添加--dev参数可安装只在开发过程中使用的 package;
    • composer update:按照 composer.json 中给定的规则,升级依赖到最新版本,并且升级 composer.lock 文件
    • composer dump-autoload:只更新自动加载而不去更新依赖

    composer.json 文件详解

    以 laravel 的 composer.json 文件举例:

    {
        "name": "laravel/laravel",
        "type": "project",
        "description": "The Laravel Framework.",
        "keywords": [
            "framework",
            "laravel"
        ],
        "license": "MIT",
        "require": {
            "php": "^7.1.3",
            "fideloper/proxy": "^4.0",
            "laravel/framework": "5.7.*",
            "laravel/tinker": "^1.0"
        },
        "require-dev": {
            "beyondcode/laravel-dump-server": "^1.0",
            "filp/whoops": "^2.0",
            "fzaninotto/faker": "^1.4",
            "mockery/mockery": "^1.0",
            "nunomaduro/collision": "^2.0",
            "phpunit/phpunit": "^7.0"
        },
        "config": {
            "optimize-autoloader": true,
            "preferred-install": "dist",
            "sort-packages": true
        },
        "extra": {
            "laravel": {
                "dont-discover": []
            }
        },
        "autoload": {
            "psr-4": {
                "App\\": "app/"
            },
            "classmap": [
                "database/seeds",
                "database/factories"
            ]
        },
        "autoload-dev": {
            "psr-4": {
                "Tests\\": "tests/"
            }
        },
        "minimum-stability": "dev",
        "prefer-stable": true,
        "scripts": {
            "post-autoload-dump": [
                "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
                "@php artisan package:discover --ansi"
            ],
            "post-root-package-install": [
                "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
            ],
            "post-create-project-cmd": [
                "@php artisan key:generate --ansi"
            ]
        }
    }
    
    
    • 其中,license 及前面的节点是对项目的说明。
    • require 是项目发布需要的依赖
    • require-dev 是项目开发以及测试过程中需要的依赖
    • config 是一些配置,以上面为例:
      • optimize-autoloader:在 dump 的时候是否自动优化
      • preferred-install:设置 Composer 的默认安装方法,其他可能的值:source、dist、auto(默认值),source 是全部,dist 不包括版本信息,相当于去掉 package 的 .git 目录
      • sort-packages:用来保证当引入新的 package 的时候,composer.json 中的 packages 按照 package name 排序
    • extra 是供 scripts 使用的额外数据
    • autoload 和 autoload-dev:PHP autoloader 的自动加载映射
      • classmap:生成支持支持自定义加载的不遵循 PSR-0/4 规范的类库
      • files:这个配置上面没有,但是很可能会用到,这个可以明确指定在每次请求中都会载入的文件,比如定义的一些公共方法
    • minimum-stability:指定安装 package 时的最低稳定性要求,可能的值:dev、alpha、beta、RC、stable
    • prefer-stable:设置为 true,优先使用 package 的稳定版本
    • scripts 指定在安装的不同阶段挂载的脚本
      • post-autoload-dump:在自动加载器被转储后触发,无论是 install/update 还是 dump-autoload 命令都会触发。
      • post-root-package-install:在 create-project 命令期间,根包安装完成后触发。
      • post-create-project-cmd:在 create-project 命令执行后触发。

    其他配置的解释可参考:composer.json

    PHP autoload 的一点儿记录

    classmap 引用的所有组合,都会在 install/update 过程中生成,并存储到 vendor/composer/autoload_classmap.php 文件中。这个 map 是经过扫描指定目录(同样支持直接精确到文件)中所有的 .php 和 .inc 文件里内置的类而得到的。