Protobuf-PHP:无法成功执行protoc-gen-php

时间:2012-08-23 18:48:09

标签: php protocol-buffers

我克隆了我在https://github.com/drslump/Protobuf-PHP.git找到的Protobuf-PHP存储库:https://github.com/drslump/Protobuf-PHP,我一直在研究安装和配置问题大约12个小时试图让protoc-gen-php进行转换将原型文件导入PHP类。

我正在运行PHP 5.3.2版,这就是我所做的:

  1. 已安装PEAR v1.9.4
  2. 已安装Console_CommandLine,并运行PEAR_ENV.reg以设置PEAR环境变量。
  3. 我已经尝试过每一个我能想到的排列,试图让这个插件生成一个PHP类文件,并且每次尝试都失败了。
  4. 我有一个原型文件,我们正在根文件夹中使用C#项目,我检查了proto-gen-php项目(见下文)。

        message AuditLogEntry {
            required int64 ID = 1;
            required int64 Date = 2;
            required string Message = 3;
    
            optional int32 User_ID = 4;
            optional string User_Username = 5;
            optional int32 ImpUser_ID = 6;
            optional string ImpUser_Username = 7;
    
            optional string RemoteIP = 8;
        }
    
    
        message AuditLogQuery {
            optional int64 DateRangeStart = 1;
            optional int64 DateRangeEnd = 2;
            optional string Search = 3;
            optional int32 UserID = 4;
    
            optional int32 Limit = 5;
            optional int32 Offset = 6;
        }
    
        message AuditLogResult {
            repeated AuditLogEntry LogEntries = 1;
            optional int32 TotalResults = 2;
        }
    

    以下是我遇到的一些问题:

    1. 当我尝试执行最基本的实现时:

      protoc-gen-php.bat AuditLog.proto
      

      我收到此错误:

        

      无法打开输入文件:@ bin_dir @ \ protoc-gen-php   文件名,目录名或卷标语法不正确。

      我无法在线找到有关此错误的任何信息。安装我正在使用的其中一个软件包是否存在配置问题?有什么想法吗?

    2. 由于上述错误,我在protoc-gen-php批处理文件中更改了这一行:

      "%PHPBIN%" -d display_errors=stderr -d log_errors=On -d error_log=Off "@bin_dir@\protoc-gen-php" %*
      

      "%PHPBIN%" -d display_errors=stderr -d log_errors=On -d error_log=Off "protoc-gen-php.php" %*
      
    3. 现在当我运行问题1中给出的相同命令时,我得到以下输出:

      The filename, directory name, or volume label syntax is incorrect.
      Protobuf-PHP @package_version@ by Ivan -DrSlump- Montes
      
      C:\Development\SkedFlex\php-proto-buffers\AuditLog.proto: File does not reside within any path specified using --proto_path (or -I).  You must specify a --proto_path which encompasses this file.  Note that the proto_path must be an exact prefix of the .proto file names -- protoc is too dumb to figure out when two paths (e.g. absolute and relative) are equivalent (it's harder than you think).
      
      ERROR: protoc exited with an error (1) when executed with:
        protoc \
          --plugin=protoc-gen-php="C:\Development\SkedFlex\php-proto-buffers\protoc-gen-php.php.bat" \
          --proto_path="C:\Development\SkedFlex\php-proto-buffers\library\DrSlump\Protobuf\Compiler\protos" \
          --php_out=":./" \
          "C:\Development\SkedFlex\php-proto-buffers\AuditLog.proto"
      

      我使用手册中指定的-i,-o尝试了许多变体命令:http://drslump.github.com/Protobuf-PHP/protoc-gen-php.1.html,但似乎无法取得进展......

      最后我尝试直接执行protoc:

      protoc --plugin=protoc-gen-php --php_out=./build AuditLog.proto
      

      这是错误:

      --php_out: protoc-gen-php: The system cannot find the file specified.
      

      我正处于被困的地步。是否有任何人有使用protoc-gen-php的经验可以帮助我解决我遇到的问题?

1 个答案:

答案 0 :(得分:3)

从存储库中检出后,无法直接使用.bat文件,在创建Pear包时会对其进行修改。因此,您应该使用Pear安装Protobuf-PHP,除非您想以某种方式修改库的源代码。

pear channel-discover pear.pollinimini.net
pear install drslump/Protobuf-beta

如果你不想从Pear安装,你必须手动修改protoc-gen-php.bat文件,用类似的东西替换最后一行:

C:\path\to\php.exe -d display_errors=stderr -d log_errors=On -d error_log=Off c:\path\to\protobuf-php\protoc-gen-php %*

为了修复“文件不在任何指定的路径中......”错误,您必须确保作为参数给出的任何proto文件都位于已定义的包含路径中。 Google的protoc编译器不会尝试猜测包含路径是什么,所以我们需要在所有情况下手动提供它们。

protoc-gen-php.bat -i . AuditLog.proto

这应该允许您为原型消息生成PHP文件,尽管该脚本在Windows系统中不像在Linux和OSX中那样经过测试。如果您发现任何问题,可以直接在the project site报告,如果您愿意的话。