2012-01-25 33 views
1

protobuf-net用のProtoBufToolカスタムツールを使用して、.protoファイルからC#クラスを生成しています。私はこれまで相対パスで動作するためにprotoファイルのimportステートメントを取得できませんでした。され、次の私の状況:protoファイルのインポート文でどのように相対パスを使用できますか?

directory layout

User.proto:

package Models; 

message User { 
    required int32 ID = 1; 
    required string Username = 2; 
    // etc... 
} 

UserSearch.proto:

package Models.Messages; 

import "../User.proto"; 

message UserSearchRequest { 
    optional string Query = 1; 
    optional int32 Limit = 2; 
    optional int32 Offset = 3; 
} 

message UserSearchResult { 
    required int32 NumResults = 1; 
    required int32 NumReturned = 2; 
    repeated User Users = 3; 
} 

私は私のプロジェクトで2つのプロトファイルを持っているが、このように配置されました

User.csファイルは正常に生成されますが、失敗します。 UserSearchファイルこれがエラーリストウィンドウに表示されます。

  • カスタムツールエラー:../User.proto:ファイルが見つかりません。
  • カスタムツールエラー:UserSearch.proto: "../User.proto"のインポートが見つかりませんでした。エラーが発生しました。
  • カスタムツールエラー:UserSearch.proto:22:18: "User"が定義されていません。
  • /の代わりに\\を試してみましたが、同じ結果が得られました。また、両方のprotoファイルが同じディレクトリにあり、私が../を削除した場合、インポートステートメントはうまく動作しますが、これは自分のファイルを整理する方法ではありません。

    インポートステートメントで相対パスを使用するにはどうすればよいですか?

    答えて

    2

    短い回答 - protoc(Googleの.protoパーサー)と話すときに使用するツールとパスにバグがあるはずです。私はそれを見て修正する必要があります。

    もっと厄介な答えです。 あなたがコマンドラインツールを使用しても構わない場合は、--descriptor_set_out={file}を使って.protoをバイナリにコンパイルするためにgoogleのprotocを使用して、--proto_pathオプションを選択して使用することができます(これまでのところ、これは純粋にGoogleツールです)。そのコンパイルされた記述子セットを入力としてprotogenに渡すことができます(いずれのフォーマットも処理します)。

    これはスクリプトによるビルドでは問題ありませんが、手動で行う必要はありません。私は金型の問題点を見てみよう。リストに追加されました。

    +0

    あなたがバグを修正できるなら、私は確かにそれを感謝します!知っておいてよかったです(いずれの形式も受け入れている原型に関する)。たぶん私はそれを利用することができます。しかし、VSツールを使用すると開発者のワークフローがはるかに改善されます。 –

    +0

    私はChrisと同じ問題を抱えていましたが、 'protogen.exe'コマンドラインツールを使用していました。私は "Some.proto:File not found"を受け取りました。エラー。 'protoc'を使って中間のバイナリファイルにコンパイルし、そのファイルを' protogen.exe'に渡すことはやりました。 –

    +1

    @Marc Gravell、これはこれまでに修正されていますか? –

    関連する問題