123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- #!/usr/bin/env php
- <?php
- /**
- * 自动编译 protos 目录下所有 .proto 文件
- * 使用方法:php compile_protos.php [输出目录]
- */
- // 参数检查
- if ($argc < 2) {
- echo "使用方法: php compile_protos.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";
- }
- }
- }
|