#!/usr/bin/env php \n"; exit(1); } $protoDir = __DIR__ . '/protos'; $outputDir = rtrim($argv[1], '/'); // 检查 protoc 是否安装 exec('protoc --version 2>&1', $output, $retval); if ($retval !== 0) { echo "错误: 找不到 protoc 编译器,请先安装:\n"; echo "MacOS: brew install protobuf\n"; echo "Linux: sudo apt-get install protobuf-compiler\n"; echo "Windows: choco install protoc\n"; exit(1); } // 创建输出目录 if (!file_exists($outputDir)) { if (!mkdir($outputDir, 0755, true)) { echo "错误: 无法创建输出目录 {$outputDir}\n"; exit(1); } } // 递归查找所有 .proto 文件 $iterator = new RecursiveIteratorIterator( new RecursiveDirectoryIterator($protoDir), RecursiveIteratorIterator::LEAVES_ONLY ); $protoFiles = []; foreach ($iterator as $file) { if ($file->getExtension() === 'proto') { $protoFiles[] = $file->getRealPath(); } } if (empty($protoFiles)) { echo "在 {$protoDir} 目录中没有找到 .proto 文件\n"; exit(0); } // 编译每个文件 $successCount = 0; foreach ($protoFiles as $protoFile) { $relativePath = substr($protoFile, strlen($protoDir) + 1); echo "正在编译 {$relativePath}... "; $command = sprintf( 'protoc --php_out=%s --proto_path=%s %s 2>&1', escapeshellarg($outputDir), escapeshellarg(dirname($protoFile)), escapeshellarg($protoFile) ); exec($command, $output, $retval); if ($retval === 0) { echo "成功\n"; $successCount++; } else { echo "失败\n"; echo "错误信息:\n" . implode("\n", $output) . "\n"; } } echo "\n编译结果: 成功 {$successCount} 个,共 " . count($protoFiles) . " 个文件\n"; // 生成自动加载文件 generateAutoload($outputDir); /** * 生成 composer 自动加载配置 */ function generateAutoload(string $outputDir) { $autoloadFile = $outputDir . '/composer.json'; if (!file_exists($autoloadFile)) { $data = [ 'name' => 'generated/protobuf-messages', 'description' => '自动生成的 Protocol Buffers 消息类', 'autoload' => [ 'psr-4' => [ 'GPBMetadata\\' => 'GPBMetadata/', 'Common_pack\\' => 'Common_pack/', '' => './' ] ], 'require' => [ "google/protobuf" => "^3.22" ] ]; if (file_put_contents($autoloadFile, json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE))) { echo "\n已生成 composer.json 自动加载配置,请执行以下命令完成设置:\n"; echo "cd {$outputDir} && composer install && composer dump-autoload\n"; // 自动创建必要的子目录 @mkdir("{$outputDir}/GPBMetadata", 0755, true); @mkdir("{$outputDir}/Common_pack", 0755, true); } else { echo "\n警告: 无法生成 composer.json 文件\n"; } } }