在现代 PHP 项目开发中,composer.json 是用于管理依赖和自动加载的重要文件。虽然手动编写 composer.json 是常见的做法,但当项目结构复杂或依赖较多时,手动操作难免会繁琐。为了解决这一问题,我编写了一个小脚本,能够自动生成符合项目需求的 composer.json 文件。本文将分享该脚本的设计思路和实现细节~🥰
脚本的作用
这个小脚本的主要功能是:
- 自动检测命名空间:通过扫描项目中指定目录的代码,自动提取命名空间,生成符合 PSR-4 标准的
autoload配置。 - 自动检测已安装的依赖:从项目的
vendor目录中识别当前的依赖,并分别归类到require和require-dev中。 - 快速生成
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);
如何运行脚本
- 准备文件夹结构
要运行这个脚本,项目文件夹需要满足以下基本结构(以 ThinkPHP 项目为例):
project-directory/
|-- application/ # 项目的主代码目录,包含 PHP 文件
|-- vendor/ # Composer 自动生成的依赖目录
|-- composer/ # 应包含 `installed.json` 文件
|-- generateComposerJson.php # 本脚本所在文件
- 运行脚本
将脚本保存为 generateComposerJson.php,然后通过命令行运行:
php generateComposerJson.php
- 检查生成结果
运行成功后,会在项目根目录生成一个 composer.json 文件。您可以打开并检查文件内容是否符合预期~🤩
注意事项
- 确保文件夹结构正确:代码目录默认为
application,可以根据需要修改为项目实际的目录名称。 - 已安装依赖的检查:
vendor/composer/installed.json文件必须存在,这是检测当前依赖的关键。 - PHP 版本要求:脚本默认设置 PHP 版本为
>=7.4,可以根据项目需求进行修改。
小结
通过这个脚本,我们可以快速生成与项目实际情况匹配的 composer.json 文件,省去了手动编辑的繁琐过程。🤔 当然,这只是我在自己现有的知识基础上实现的一个简单工具,可能还有许多可以优化的地方,欢迎大家一起探讨和改进哦~😊💖