Кто-нибудь знает о расширенном инструменте diff для С#?
Я ищу инструмент diff, который может анализировать мой код и рассказывать мне, что изменилось на основе конструкции путем построения.
Например, если я вырезаю и вставляю метод с начала моего файла и помещаю его в конец, но оставляю этот метод неизменным, я не хочу, чтобы он был помечен. Если, однако, я вставляю строку кода или что-то изменяю внутри этого метода, он будет отмечать его как измененный.
Я использовал различные инструменты для сравнения, но все они, похоже, не знают, что строки были вставлены, удалены или изменены, но не могли определить, какие изменения были в логическом виде. Было бы неплохо, если бы я периодически перестраивал компоновку моего файла кода, инструмент diff мог бы не отставать.
Есть ли у кого-нибудь такой инструмент?
Ответы
Ответ 1
Я использую http://winmerge.org/
Я не думаю, что вы можете делать то, что вы просите, из-за того, что для этих инструментов работают алгоритмы самая длинная общая подпоследовательность.
Даже если ваши функции будут перегруппированы, а функциональность исходного файла останется неизменной, она все равно будет отображаться как разница из-за характера LCS.
ИЗМЕНИТЬ:
Это немного странно, но если бы вы чувствовали себя амбициозными, вы могли бы написать свои собственные портные для ваших конкретных потребностей.
вы можете использовать регулярные выражения для вытаскивания каждого метода в исходном файле и выполнять разницу LCS для каждого метода индивидуально в зависимости от его имени. Вы можете сохранить свой код в словарях (ключ, значение), чтобы ключ был именем метода, а значение - строкой функции. Затем вы просто разделите словарь_orig ['method'] на свой словарь dictionary_new ['method'].
Кроме этого, я не знаю, как бы вы выполнили то, что искали.
Ответ 2
Ознакомьтесь с нашим инструментом Smart Differencer, в котором сравниваются абстрактные деревья синтаксиса,
и сообщает о различиях в терминах нетерминалов ( "языковые конструкции" )
что АСТ представляют, и плавные действия редактирования (вставка, удаление, перемещение), а также обнаружение последовательного переименования.
В настоящее время он обрабатывает только Java и COBOL, но он основан на DMS, который
имеет синтаксические анализаторы для широкого разнообразия языков, включая С#.
EDIT 9/8/2009: С# SmartDifferencer теперь доступен для бета-тестеров.
Инструмент уже обрабатывает согласованное переименование по всему файлу как
семантически тривиально (в предположении, что ссылка на другие файлы
переименованный символ соответственно), а также переименовывается в пределах области.
Мы планируем учитывать семантически тривиальные изменения, такие
как перемещение объявления метода в классе для Java и С#.
EDIT Октябрь 2010: Доступны производственные версии. Eval downloads
доступный на веб-сайте.
EDIT Май 2012. Вы можете увидеть пример С# на этой странице.
Одна из вещей, которые он сейчас не делает, - это игнорировать семантически нулевые изменения. Частным примером является перетасовка методов в классе класса; мы все знаем, что это не влияет на семантику для С#. Наш инструмент сравнивает синтаксис (через AST), а не семантику, поэтому он не понимает этот конкретный нюанс и, следовательно, говорит пользователю, что "это было перемещено", а не молчание. В будущем мы планируем обрабатывать подобные случаи, но, к сожалению, каждый продукт должен иметь версию 1: -} [В качестве тонкой точки методы перетасовки в Java-классе также семантически нулевые, но перетасовки полей не подлежат к порядку оценки инициализаторов. Я не знаю, верно ли это для С#, но это меня не удивит.]
Ответ 3
Готовы ли вы выполнить сравнение на скомпилированных сборках? Если это так, .NET Reflector имеет надстройку, доступную под названием Diff, который позволит вам сравнить 2 сборки. Это определенно не волнует, где/как ваши объекты расположены внутри исходного файла.
Ответ 4
Название этого инструмента - CodeCompare. Попробуйте - CodeCompare. Требуемая функция называется сравнение структуры.
Ответ 5
Мне тоже интересно. Я не думаю, что он существует. В других сценариях имеются "функциональные" (в отличие от просто текстовых) инструменты diff. Например. Microsoft Word интегрирует свою собственную функцию diff/merge (которая может быть написана сценарием, поэтому ее можно интегрировать, например, TortoiseSVN), а также есть несколько инструментов для XML, которые интерпретируют XML файлы и не просто рассматривают их как текст.
Я не уверен, что добавленная ценность такого инструмента над хорошим текстовым инструментом diff/merge будет достаточно сложной, чтобы заслужить ее разработку. OTOH это может быть просто недостающее звено, решающее "боль при слиянии", которое мы все чувствуем, столкнувшись с трудной ситуацией слияния.
Трудность, конечно, в том, что вы должны интерпретировать код так же, как это делает компилятор С#. На данный момент инструмент, который является самым близким, действительно является NDepend, я думаю. Это сообщение в блоге объясняет некоторые из его возможностей в этом отношении.
Ответ 6
Помимо сравнения Scooter Software скалы для этого, и это дешево ($ 30) тоже.
Ответ 7
Я нахожу SemanticMerge, чтобы быть очень полезной. Он отображает различия в приятном визуальном образе и является легким для сравнения сложного кода на С#.
Ответ 8
Я знаю, что вы ищете инструмент. Но так как я ничего не знаю, вот как бы я это сделал:
- Прочитайте книгу о дизайне компилятора
- Лекс/Разбор кода
- Создание абстрактного дерева синтаксиса
- Придумайте алгоритм для выполнения различий в дереве синтаксиса
- Profit!
Ответ 9
Я использую KDiff и обнаруживаю, что он работает очень хорошо. И, конечно же, бесплатно.
Ответ 10
Как и многие из предложенных, я предполагаю, что такое сравнение будет невозможно с помощью доступных инструментов diff. Потому что их цель - сказать, изменилось ли что-то, и если вы перемещаете метод от начала до конца, что-то действительно что-то изменило.
Но теперь мне приходит в голову, что вы можете сделать это сами. В основном вызывается некоторый инструмент diff, который затем возвращает вновь вставленные строки, в основном метод, который вы переместили в конец вашего файла. Затем вы можете сделать сравнение самостоятельно, изменили ли строки, которые уже присутствуют в вашем предыдущем файле.
Ответ 11
Я думаю, что для сравнения файлов в Интернете вы должны использовать http://www.diffnow.com. Я использую это, имея возможность выбирать язык во время сравнения, его очень приятный
Ответ 12
DiffMerge от SourceGear отлично работает и доступен бесплатно.
http://www.sourcegear.com/diffmerge/