none
.Designer.cs .resx バージョン管理について RRS feed

  • 質問

  • お世話になります。

    表記の件、VS2010にてアプリケーション開発を行っていますが、

    バージョン管理(Subversion,TortoiseSVN)に苦慮しています。

    [内容]

    デザイナーにてフォントサイズを変更しただけで、表記ファイル記述内容が大幅に変更されてしまい、

    変更内容が容易に確認できない状況が発生しています。

    変更差分を確認すると管理ソフト(Subversion,GIT等)に関係なく発生する問題だと予想されます。

    それとも何かVSにアドインされるソフトを使用すれば、変更点のみを確認できるのでしょうか?

    WEB等を検索してみましたが、有効な情報が見つからない為、途方に暮れています。

    助言を頂けると助かります。

    以上、宜しくお願い致します。

    2017年3月22日 7:18

回答

すべての返信

  • バージョン管理に依存しない、Windows Forms の問題ですね。
    少しぐぐってみるとこういうのは出てきますね。

    https://www.codeproject.com/Articles/37022/Solving-the-resx-Merge-Problem

    https://marketplace.visualstudio.com/items?itemName=YonatanEldar.Resxsorter

    その他に、WinMerge で比較する設定にしておいて移動ブロック検知を設定しておけば、移動しただけのブロックは色が変わってわかりやすくなるという方法もなくはないですが…。

    2017年3月22日 12:56
    モデレータ
  • 例に挙げられているフォントサイズ変更ですが、その場合、コントロールのサイズ・位置がすべて変更になってしまうので、diffが膨大になってしまうのはある意味仕方がありません。またサイズ・位置が実際に変更されているわけですから、diffを確認せざるを得ないのも事実です。

    このほかの変更を行った際、自動生成コードは同じアルゴリズムで生成しているので、不用意に順番が入れ替わったりせずdiffは最小限に抑えられているものと思われます。

    # 仮にWPFなら倍率を指定して全体を拡大縮小できますっけ…? その場合は変更個所は倍率部分だけに抑えられるかと。(自信無し、実際に採用するかは別問題です。)

    2017年3月23日 4:47
  • たとえばDataGreidViewとかみたいに、一つの設定の大量のオブジェクトが係るようなコントロールだと、たとえば設定を一つ変更しただけが、子オブジェクトの名前(番号)から何からすべて新しく付け直されて、ごっそり移動してしまいます。

    当然自動生成される子オブジェクトの名前が変わっているので、diffではブロックごとごそっと変更範囲になり、かつ場所も移動しているので、コードが大きくなるとまともに変更を負うのは無理になります。

    この辺は普通に不便で、あまりうまくない作りになっています。

    ※フォントを変更したのでコントロールの一が移動してなどではなく、一切ほかに影響しないはずの(一文字の変更で済むはずの)変更でも、ごっそりコードが書き換わったります。

    2017年3月23日 6:30
  • この辺りの話は私も昔から頭を悩ましまして、いわゆる仕様バグなのではないかと勘繰ってたりもします。でも、Microsoft としては、Forms はクラシックデスクトップという旧いUIという位置づけなので、問題として挙げられても仕様修正は考えないでしょうねぇ。


    本フォーラムは、ユーザー(開発者)同士で情報交換を行うためのコミュニティです。初めて利用される方は、以下のアナウンスをご覧ください。 https://social.msdn.microsoft.com/Forums/ja-JP/ca9ecfb7-4407-4fcb-b8bd-207d68257e68?


    2017年3月23日 6:38
    モデレータ
  • なちゃさんひらぽんさんありがとうございます。

    そんなもんなんですね…。フォームデザイナの生成するコードは本来不要な部分も大量に生成されているので、フォームデザイナを使わない場合は大幅にコードが削減できていて、私自身はあまり気にしていませんでした。
    # 例えば、Nameは使わなければ設定不要ですし、DockするならSizeに意味がなくなるし、等。そもそもFormクラスを継承する意義もありませんし。

    参考までにLocalizable = Trueとして設定値を.Designer.csではなく.resxに生成させた場合でも順序は頻繁に入れ替わってしまうのでしょうか? 仮にそうだとしてもXML Diffツールで比較すれば差分は最小化できたりしないでしょうか?


    • 編集済み 佐祐理 2017年3月23日 6:51
    2017年3月23日 6:49
  • 参考までにLocalizable = Trueとして設定値を.Designer.csではなく.resxに生成させた場合でも順序は頻繁に入れ替わってしまうのでしょうか?

    そうですね。
    レビューをしていると、resx の順番が大幅に変わることはよく見かけます。
    どういったときに起きやすいのかといった再現条件まではわかっていませんが…。
    (フォントサイズ要因以外でよくあるので)

    仮にそうだとしてもXML Diffツールで比較すれば差分は最小化できたりしないでしょうか?

    XML の並び順を気にしない Diff ツールであれば用を満たせるとは思います。
    ただ、それは差分がないかのチェックなので、ブランチ・マージを多用する案件で resx がコンフリクトしたら、きついかもしれません。


    2017年3月23日 12:20
    モデレータ
  • Azulean様、皆様

    ご回答、どうも有難うございます。

    WinMergeを比較ツールとして使用していたのですが、移動ブロック検知設定は知りませんでした。

    完璧という感じではありませんが、あまり時間をかけることも出来ない為、妥協します。

    変更点を容易に確認できることは、ペアプログラミングや履歴確認という観点から自分は重要だと感じているのですが、

    自動生成されるUI部分に関しては、利便性と引き換えになると理解しました。

    (コストをかければ可能かもしれませんが、MSに大きなメリットは無いと判断された?)

    貴重なご意見、情報を頂きどうも有難うございました。

    今後とも宜しくお願い致します。

    2017年4月13日 11:03