Подтвердить что ты не робот

Почему код сгенерированный С# (например, Form1.designer.cs) проигрывает с Subversion?

Моя мастерская недавно переключилась на Subversion из SourceSafe, освободив нас от автоматических замков. Это привело к одновременному редактированию форм, что прекрасно. Но когда несколько разработчиков фиксируют свои изменения, файлы кода, созданные дизайнером (все файлы с именем TheFormName.designer.cs), вызывают конфликты, которые очень трудно разрешить.

Насколько я могу судить, это связано с тем, что код, созданный дизайнером, сильно перенастраивается всякий раз, когда пользователь его модифицирует, независимо от того, насколько реально фактическое изменение действительно имело значение.

  • Как облегчить эти конфликты?
  • Есть ли способ сказать разработчику изменить код меньше?
  • Как вы, опытные команды С#, имеете дело с одновременной модификацией формы?
4b9b3361

Ответ 1

Я не знаком с С# или конструктором форм Windows, но, глядя на некоторые файлы designer.cs, которые я могу найти в Интернете, у них нет особо сложной структуры.

Какие части его перестраиваются? Я предполагаю, что это в основном порядок свойств в методе InitializeComponent(), который перепутался?

Если это так, вы можете написать простой script, который переупорядочивает эти строки в алфавитном порядке, скажем (особенно, если вы никогда не редактируете эти файлы вручную) и используйте это как pre-commit hook script в Subversion.

Ум, правый... царапины это. Большое красное поле внизу этого раздела говорит, что вы не должны изменять транзакции в сценариях крюка. Но вы могли бы найти другой способ запустить этот script где-то между файлом designer.cs, который будет изменен, и он будет зафиксирован.

Edit:

Собственно, данный scraimer комментирует это:

Общий взломать, но в худшем случае, перед слиянием, я мог сортировать файлы BOTH и делать слияние просто по очереди...

Вы не можете позволить Subversion установить внешнюю программу слияния? Я использовал KDiff3, который может запустить препроцессор перед выполнением различий или слияний, чтобы вы могли автоматизировать этот процесс.

Ответ 2

Вот несколько примеров:

  • Сделайте вещи более модульными. Используйте компоненты, такие как User Controls и т.д., Чтобы разделить формы на несколько физических файлов меньшего размера.
  • Используйте шаблоны дизайна презентационного слоя, такие как MVP, чтобы переместить код из представлений и в стандартные классы POCO.
  • Последние версии SVN позволяют выполнять жесткие блокировки - используйте это, чтобы избежать сложных сценариев слияния.

Надеюсь, что это поможет.

Ответ 3

Я уверен, что нет серебряной пули для этой проблемы, поскольку дизайнер топает по всему дизайну.

Все, что я могу предложить, - это минимизировать использование дизайнера. Лично я привязываюсь только к событиям в коде и использую только конструктор только для инициализации и позиционирования. Поэтому не слишком сложно понять различия в наборе изменений ( "о, кто-то добавил кнопку", "о, кто-то изменил, как выглядит немного" ).

Ответ 4

Да, конструктор случайной перестановки уверен, раздражает. Использует ли Microsoft собственные инструменты? Microsoft смотрит на то, что они проверяют на контроль версий? Это поражает ум.

Наша команда "решение" заключается в том, чтобы вручную редактировать файлы Designer после того, как мы закончили их редактирование, чтобы вернуть все туда, где они были, чтобы текстовый diff был читабельным, и поэтому одновременные изменения могут быть объединены здраво. К счастью, большая часть перестройки Visual Studio проста, поэтому это работает.

К сожалению, мы обнаружили, что этот шаг необходим для проверки правильности - мы обнаружили случаи, когда Designer молча удаляет все, что необходимо, что приводит к потере кода. Таким образом, этот шаг должен быть выполнен, чтобы обойти все разрушающие данные ошибки. Вздох.

Так как Microsoft имеет неудовлетворительный опыт исправления своих ошибок, единственным решением может быть улучшение Mono WinForms Designer, чтобы оно было готово для простого время.

Ответ 5

Единственный способ, которым я знаю, действительно избежать этой проблемы при использовании системы управления исходным кодом типа слияния, такой как подрывная деятельность, - это передать код формам, а не использовать конструктор. Очевидно, это не будет хорошо, потому что ручное кодирование этих форм может занять некоторое время.

Причина этого в том, что свойства управления сериализуются конструктором в том порядке, в котором они отбрасываются в форме. Вырезание и вставка могут влиять на этот порядок, а также перемещать элемент управления, чтобы он имел нового родителя (например, перемещение элемента управления на панель, когда оно было непосредственно непосредственно в форме).

У меня возникла эта проблема в большом проекте, и мне пришлось внедрить довольно уродливый подход - сопоставьте файлы designer.cs с контрольной версией check-in и вручную объедините их с помощью инструмента объединения. Это не идеально, но это единственный способ, с помощью которого я вижу, что это работает последовательно с svn или другим средством управления исходным стилем слияния.

Другой вариант - использовать подход блокировки с контролем источника, как указывали другие, но это также связано с неприятными побочными эффектами.