自动生成 `composer.json` 文件的小脚本

192 阅读3分钟

在现代 PHP 项目开发中,composer.json 是用于管理依赖和自动加载的重要文件。虽然手动编写 composer.json 是常见的做法,但当项目结构复杂或依赖较多时,手动操作难免会繁琐。为了解决这一问题,我编写了一个小脚本,能够自动生成符合项目需求的 composer.json 文件。本文将分享该脚本的设计思路和实现细节~🥰

脚本的作用

这个小脚本的主要功能是:

  1. 自动检测命名空间:通过扫描项目中指定目录的代码,自动提取命名空间,生成符合 PSR-4 标准的 autoload 配置。
  2. 自动检测已安装的依赖:从项目的 vendor 目录中识别当前的依赖,并分别归类到 requirerequire-dev 中。
  3. 快速生成 composer.json:根据项目的实际情况,生成完整的 composer.json 文件。

背景故事

在实际工作中,我惊讶地发现我们公司目前的一些项目居然没有 composer.json 文件!😱 这对于现代 PHP 项目来说实在是不可思议,毕竟 composer.json 是非常重要的依赖管理工具。于是,我决定自己写一个小脚本,快速为这些项目补齐 composer.json 文件。✨

本脚本的开发基于 ThinkPHP 5.1 框架,目录结构和逻辑均针对该框架设计。不知道在其他框架下是否适用,但欢迎大家尝试并提出改进意见哦~😘

代码实现

以下是脚本的完整代码:

<?php

function generateComposerJson($projectDir) {
    // 自动检测命名空间
    $codeDir = $projectDir . '/application'; 
    $namespace = detectNamespace($codeDir);

    // 自动检测依赖
    $dependencies = detectDependencies($projectDir);

    // 构建 composer.json 内容
    $composerJson = [
        "name" => "vendor/project-name",
        "description" => "生成composer.json",
        "type" => "project",
        "require" => $dependencies['require'],
        "autoload" => [
            "psr-4" => [
                $namespace . "\" => "application/"
            ]
        ],
        "require-dev" => $dependencies['require-dev'],
        "minimum-stability" => "dev",
        "prefer-stable" => true
    ];

    // 将结果写入 composer.json
    $composerJsonContent = json_encode($composerJson, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
    file_put_contents($projectDir . '/composer.json', $composerJsonContent);

    echo "composer.json 已成功生成!\n";
}

// 自动检测命名空间
function detectNamespace($codeDir) {
    $namespace = 'App'; // 默认值
    if (is_dir($codeDir)) {
        $files = scandir($codeDir);
        foreach ($files as $file) {
            if (is_file($codeDir . '/' . $file) && pathinfo($file, PATHINFO_EXTENSION) === 'php') {
                $content = file_get_contents($codeDir . '/' . $file);
                if (preg_match('/namespace\s+([a-zA-Z0-9_\\]+);/', $content, $matches)) {
                    $namespace = $matches[1];
                    break;
                }
            }
        }
    }
    return $namespace;
}

// 自动检测依赖
function detectDependencies($projectDir) {
    $require = [];
    $requireDev = [];

    // 检查 vendor 目录是否存在
    $vendorDir = $projectDir . '/vendor/composer/installed.json';
    if (file_exists($vendorDir)) {
        $installedPackages = json_decode(file_get_contents($vendorDir), true);
        foreach ($installedPackages as $package) {
            if (!empty($package['dev'])) {
                $requireDev[$package['name']] = $package['version'];
            } else {
                $require[$package['name']] = $package['version'];
            }
        }
    }

    // 添加 PHP 版本依赖
    if (empty($require['php'])) {
        $require['php'] = '>=7.4';
    }

    return ['require' => $require, 'require-dev' => $requireDev];
}

// 脚本入口
$projectDir = __DIR__; // 当前目录
generateComposerJson($projectDir);

如何运行脚本

  1. 准备文件夹结构

要运行这个脚本,项目文件夹需要满足以下基本结构(以 ThinkPHP 项目为例):

project-directory/
|-- application/         # 项目的主代码目录,包含 PHP 文件
|-- vendor/              # Composer 自动生成的依赖目录
    |-- composer/        # 应包含 `installed.json` 文件
|-- generateComposerJson.php  # 本脚本所在文件
  1. 运行脚本

将脚本保存为 generateComposerJson.php,然后通过命令行运行:

php generateComposerJson.php
  1. 检查生成结果

运行成功后,会在项目根目录生成一个 composer.json 文件。您可以打开并检查文件内容是否符合预期~🤩

注意事项

  • 确保文件夹结构正确:代码目录默认为 application,可以根据需要修改为项目实际的目录名称。
  • 已安装依赖的检查vendor/composer/installed.json 文件必须存在,这是检测当前依赖的关键。
  • PHP 版本要求:脚本默认设置 PHP 版本为 >=7.4,可以根据项目需求进行修改。

小结

通过这个脚本,我们可以快速生成与项目实际情况匹配的 composer.json 文件,省去了手动编辑的繁琐过程。🤔 当然,这只是我在自己现有的知识基础上实现的一个简单工具,可能还有许多可以优化的地方,欢迎大家一起探讨和改进哦~😊💖