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

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

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

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

person Shalom Craimer    schedule 28.01.2009    source источник
comment
Никогда не было проблем с файлами дизайнера (хотя я действительно не делаю приложения WinForms), но обычно то же самое происходит с файлами csproj, что очень раздражает :-(   -  person Steven Robbins    schedule 28.01.2009
comment
ОК, я назначил награду — мне бы очень хотелось найти для этого хорошее решение. Я надеюсь, что кто-то может помочь.   -  person Shalom Craimer    schedule 31.01.2009
comment
@StevenRobbins Я думаю, что ситуация с файлами проекта улучшилась с VS 2013 и новее. Он неплохо справляется с тем, чтобы не переупорядочивать директивы MSBuild.   -  person binki    schedule 30.06.2017


Ответы (5)


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

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

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

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

Редактировать:

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

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

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

person mercator    schedule 01.02.2009
comment
Это звучит как действительно очень крутое решение. Полный хак, но в худшем случае, непосредственно перед слиянием, я мог бы отсортировать ОБА файла, и сделать слияние просто построчным делом... Конечно, это чем-то похоже на лечение пациента, поместив его в блендером, а затем собрать их вместе. - person Shalom Craimer; 01.02.2009
comment
По крайней мере, убедитесь, что вы выбрали инструмент трехстороннего слияния (например, KDiff3). Двухсторонний инструмент слияния не может помочь вам в решении таких проблем. - person Bert Huijben; 02.03.2009
comment
Я реализовал сортировку, но она хитрая, и мне приходилось ее исправлять много раз. Помните, что элементы в конструкторе имеют древовидную структуру, и их порядок соответствует ей. Кроме того, код в файле .designer действительно построен и выполнен, поэтому, например, когда вам не повезло/недостаточно опыта в сортировке 3 частей элемента управления VerticalSplitter/HorizontalSplitter, ваше приложение компилируется, но вы можете получить исключение времени выполнения от сплиттера, жалуясь на незаконная установка положения разветвителя. - person miroxlav; 09.02.2016

Вот что можно попробовать:

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

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

person Andrew Peters    schedule 28.01.2009
comment
Да, на самом деле мы уже сделали все это модульным, просто чтобы позволить нам работать с VSS, и мы не используем бизнес-код на нашем уровне представления (который представляет собой файлы designer.cs). Однако я надеялся на более элегантное решение, чем блокировки SVN. Спасибо! - person Shalom Craimer; 29.01.2009
comment
Что ж, один из элегантных способов — закодировать их все вручную! ;-) - person Andrew Peters; 29.01.2009

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

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

person Quibblesome    schedule 31.01.2009
comment
Думаю, я действительно прошу о чем-то столь же волшебном, как серебряная пуля! Мы уже свели к минимуму количество кода, входящего в Designer.cs, не говоря уже о коде, входящем в любую часть графического интерфейса. Думаю, я надеюсь, что кто-то придет с творческим решением... - person Shalom Craimer; 01.02.2009
comment
Я думаю, что /есть/ серебряная пуля, по крайней мере теоретически: Visual Studio должна просто вносить согласованные изменения в этот файл, а не произвольно перемещать вещи каждый раз. - person Roman Starkov; 22.11.2010
comment
Я знаю, я, вероятно, опоздал с этим, но если проблема раздражает вас так же сильно, как и меня, вы можете проголосовать за улучшение ситуации на visualstudio.uservoice.com. - person berntie; 20.09.2012
comment
Я отправил новый пользовательский голос, так как исходный был закрыт. - person binki; 30.06.2017

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

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

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

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

person ulatekh    schedule 23.10.2012
comment
MS использует TFS, который плохо справляется со слиянием и в основном работает со старым подходом с однопользовательской проверкой в ​​​​стиле VSS. Так что я думаю, люди MS не видят проблемы. - person gbjbaanb; 23.10.2012
comment
@gbjbaanb - ни исходный код, ни TFS не требуют блокировки файлов, и оба они прекрасно объединяют одновременные изменения (в sourcesafe есть странные причуды с ветвлением/слиянием, но это другая история). - person Erik Funkenbusch; 23.10.2012

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

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

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

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

person Darren Stokes    schedule 01.02.2009
comment
Это решения, которые мы уже были вынуждены использовать, и они не очень удовлетворительны. Но спасибо за ваш совет. - person Shalom Craimer; 02.02.2009