Почему сгенерированный дизайнером C # код (например, Form1.designer.cs) разрушает Subversion? - PullRequest
17 голосов
/ 28 января 2009

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

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

  • Как мне разрешить эти конфликты?
  • Есть ли какой-нибудь способ сказать дизайнеру меньше изменять код?
  • Как вы, опытные команды C #, имеете дело с одновременным изменением формы?

Ответы [ 5 ]

10 голосов
/ 28 января 2009

Вот несколько вещей, которые стоит попробовать:

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

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

3 голосов
/ 31 января 2009

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

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

2 голосов
/ 23 октября 2012

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

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

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

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

2 голосов
/ 01 февраля 2009

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

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

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

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

Edit:

На самом деле, учитывая комментарий скреймера на это:

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

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

0 голосов
/ 01 февраля 2009

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

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

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

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

...