Skip to content

composer的基础使用

1. 创建项目

1. 初始化配置步骤

运行 composer init 后,按以下步骤配置:

1. 包名 (Package name)

txt
Package name (<vendor>/<name>) [pc/design-patterns-php]: shenlink/design-pattern

这里填写的是 shenlink/design-pattern

2. 项目描述 (Description)

txt
Description []: PHP implementation of design patterns.

3. 作者信息 (Author)

txt
# 这里 composer 会提示是否使用默认 git 的作者信息,直接回车或填写作者信息
Author [shenlink <2024133718@qq.com>, n to skip]:

4. 最小稳定性 (Minimum Stability)

txt
Minimum Stability []: stable

5. 项目类型 (Package Type)

txt
Package Type (e.g. library, project, metapackage, composer-plugin) []: project

6. 开源协议 (License)

txt
License []: MIT

7. 依赖管理 (Dependencies)

txt
# 直接回车跳过(设计模式项目通常不需要额外依赖)
Would you like to define your dependencies (require) interactively [yes]? n
# 直接回车跳过,稍后手动安装测试框架
Would you like to define your dev dependencies (require-dev) interactively [yes]? n

8. 自动加载配置

txt
# 直接回车,使用默认的 PSR-4 配置,也可以自己手动配置
Add PSR-4 autoload mapping? Maps namespace "Shenlink\DesignPattern" to the entered relative path. [src/, n to skip]:

9. 确认

这时候显示的配置信息,请确认是否正确,如果正确请输入 yes 继续,否则请输入 n 退出。

json
{
    "name": "shenlink/design-pattern",
    "description": "PHP implementation of design patterns.",
    "type": "project",
    "license": "MIT",
    "autoload": {
        "psr-4": {
            "Shenlink\\DesignPattern\\": "src/"
        }
    },
    "authors": [
        {
            "name": "shenlink",
            "email": "2024133718@qq.com"
        }
    ],
    "minimum-stability": "stable",
    "require": {}
}
txt
# 输入 yes ,确认配置信息
Do you confirm generation [yes]? yes

2. 关键调整

1. 安装测试框架

安装 PHPUnit ,作为项目的测试框架

shell
composer require --dev phpunit/phpunit

2. 修改 composer.json 文件

  • 新增 autoload-dev 配置
json
"autoload-dev": {
    "psr-4": {
        "Tests\\": "tests/"
    }
}

这样之后,在根目录创建 tests目录,该目录的命名空间就是 \Tests

  • 新增 composer 运行命令
json
"scripts": {
    "test": [
        "php shenlink test"
    ]
}

这样之后,在根目录创建 shenlink 文件,并写入以下内容:

php
<?php

declare(strict_types=1);

class Shenlink
{
    private array $commands = [];
    private const VERSION = "1.0.0";

    public function __construct()
    {
        $this->registerCommand('-h', [$this, 'handleHelpCommand']);
        $this->registerCommand('--help', [$this, 'handleHelpCommand']);
        $this->registerCommand('test', [$this, 'handleTestCommand']);
    }

    public function registerCommand($name, $handler): void
    {
        $this->commands[$name] = $handler;
    }

    public function run(array $argv): void
    {
        if (count($argv) < 2) {
            $this->handleHelpCommand();
            return;
        }

        $command = $argv[1];

        if (!isset($this->commands[$command])) {
            echo "命令未找到: $command\n";
            $this->handleHelpCommand();
            return;
        }
        call_user_func($this->commands[$command]);
    }

    private function handleHelpCommand(): void
    {
        $this->showHelpInfo();
    }

    private function handleTestCommand(): void
    {
        echo "running tests...\n";

        // 调用 PHPUnit 执行测试
        $phpunitCommand = __DIR__ . '/vendor/bin/phpunit';
        $output = shell_exec($phpunitCommand);

        if ($output === null) {
            echo "错误: 无法执行 PHPUnit。请确保已正确安装 PHPUnit ,并配置好 phpunit.xml 。\n";
            echo "使用的命令: $phpunitCommand\n";
        } else {
            echo $output;
        }
    }

    private function showHelpInfo(): void
    {
        echo "可用命令:\n";
        echo "  -h, --help - 显示帮助信息\n";
        echo "  test - 运行测试\n";
    }
}

$shenlink = new Shenlink();
$shenlink->run($argv);

执行 php shenlink test命令或 composer test 命令, 运行测试

  • 明确 php 版本依赖
json
"require": {
    "php": "^7.4"
},

3. 完整的 composer.json 文件

json
{
    "name": "shenlink/design-pattern",
    "description": "PHP implementation of design patterns.",
    "authors": [
        {
            "name": "shenlink",
            "email": "2024133718@qq.com"
        }
    ],
    "type": "project",
    "license": "MIT",
    "require": {
        "php": "^7.4"
    },
    "require-dev": {
        "phpunit/phpunit": "^9.6"
    },
    "autoload": {
        "psr-4": {
            "Shenlink\\DesignPattern\\": "src/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "Tests\\": "tests/"
        }
    },
    "scripts": {
        "test": [
            "php shenlink test"
        ]
    },
    "minimum-stability": "stable"
}

3. 目录结构

txt
design-patterns-php/
├── src/
├── tests/
├── vendor/
│   └── ...
├── shenlink
├── composer.json
└── composer.lock

2. 安装项目

安装 laravel 框架

  • 安装命令:
shell
composer create-project --prefer-dist laravel/laravel my-laravel-app
  • 可以指定版本号:
shell
composer create-project --prefer-dist laravel/laravel my-laravel-app "8.*"

安装 8.* 版本的 laravel 框架

安装 ThinkPHP 框架

  • 安装命令:
shell
composer create-project topthink/think my-thinkphp-app
  • 可以指定版本号:
shell
composer create-project topthink/think my-thinkphp-app "6.*"

安装 6.* 版本的 ThinkPHP 框架

3. 常用命令

Composer 是 PHP 的一个依赖管理工具,常用于管理项目的库和依赖项。以下是一些常见的 Composer 命令:

  1. composer init
    用于初始化一个新的 Composer 项目,生成 composer.json 文件。

  2. composer install
    如果 composer.lock 文件存在,Composer 会从该文件读取依赖版本并安装到 vendor 目录下。如果 composer.lock 文件不存在,Composer 会从 composer.json 文件读取依赖版本并安装。通常用于部署时安装依赖。

  3. composer update
    更新项目中的依赖包到符合 composer.json 文件中约定的版本。

  4. composer require <package>
    安装指定的依赖包并将其添加到 composer.json 文件中。

  5. composer remove <package>
    移除指定的依赖包,并更新 composer.jsoncomposer.lock 文件。

  6. composer dump-autoload
    重新生成自动加载文件,用于更新类映射。

  7. composer create-project <package> <dir>
    创建一个新的项目,并安装指定包的最新版本。

  8. composer update <package>
    更新指定的包到最新版本。

  9. composer self-update
    更新 Composer 本身到最新版本。

  10. composer install --no-dev
    安装依赖时不包含开发依赖项。

  11. composer install --prefer-dist
    使用 .tar.zip 包安装,而不是从 Git 或 SVN 下载。

  12. composer require <package> --dev
    安装并将包添加到开发依赖项中。

  13. composer global require <package>
    安装全局依赖包。

4. 版本号前的符号的含义

在 Composer 中,版本号前的符号(如 ~、^、*)用于定义依赖包的版本范围。它们有不同的含义,主要帮助 Composer 确定可以安装哪些版本。下面是这些符号的详细解释:

1. ~ 符号

~ 表示版本号只能改变末尾,如果是~x.y 末尾就是 y,如果是 ~x.y.z ,末尾就是 z

  • ~1.2.3:表示 1.2.x <= 版本 < 1.3.0
  • ~1.2:表示 1.2.x <= 版本 < 2.0.0
  • ~1.0:表示 1.x.x <= 版本 < 2.0.0

2. ^ 符号

^ 表示除了大版本号以外,小版本号和补丁版本号都可以变

  • ^1.2.3:表示 1.2.3 <= 版本 < 2.0.0
  • ^1.2:表示 1.2.0 <= 版本 < 2.0.0

注意:0开头的版本号特殊对待,因为在 0.x.x 范围内,版本号的修改可能是破坏性的。 ^0.3.0 表示 0.3.0 <= 版本号 < 0.4.0 ,注意:不是 < 1.0.0

3. * 符号

* 符号用于表示 "任何版本",不管是主要、次要还是补丁版本。

  • 1.2.*: 表示 1.2.0 <= 版本 < 1.3.0
  • 1.*: 表示 1.0.0 <= 版本 < 2.0.0
  • *:表示 0.0.0 <= 版本 <

4. = 符号

= 符号用于指定一个确切的版本,意味着只安装该版本,不能升级或降级。

  • =1.2.3: 表示 1.2.3 版本

5. 其它版本范围符号

  • >>=<<=,分别代表"大于"、"大于等于"、"小于"和"小于等于"版本号。 比如:>1.2.3: 表示 1.2.3 < 版本 <

6. 版本范围符号组合

版本范围符号组合,主要是 | 符号,用于表示 或操作 ,只要符合一个版本即可,并操作 使用空格实现

  • 1.2.3|1.2.4: 匹配 1.2.3 或者 1.2.4
  • >=1.2.3 <2.0.0: 表示 1.2.3< 版本 < 2.0.0
  • >=1.2.3 <2.0.0 | >=2.1.0 <3.0.0: 表示 1.2.3< 版本 < 2.0.0 或者 2.1.0 <= 版本 < 3.0.0,满足其中一个就可以了