Краткая справка:
Diff (сравнение)– инструмент, позволяющий сравнить содержимое двух файлов и выделить их различия.
Merge (слияние)– инструмент, позволяющий соединить 2 похожих файла в 1, с учётом изменений в каждом из них.
В ходе работы над большим проектом по Банковскому ПО (Управление Кредитным портфелем) наш Junior разработчик поделился в беседе возникшей сложностью. Проблема в том, что при работе с запросом на изменение в спецификации ему тяжело обнаружить все изменения в бухгалтерской модели проводок, обязательных к реализации.
Действительно, спецификация финансовых транзакций, которая к нам приходит от заказчика составляет порядка 300 страниц. Стандартный инструмент MS Word «Track Changes» включен, и содержит историю всех изменений и согласований, через которые документ проходил у заказчика. Но «Tracking Changes» тут не помощник – он хранит историю изменнений , но не сравнивает два документа.
К счастью, все согласованные документы, поступающие в работу от заказчика, хранятся у нас в системе управления версиями. В качестве системы командной разработки мы используем TFS и Visual Studio 2010 (в перспективе планируем перейти на Visual Studio 11).
Таким образом вопрос упростился – как сравнить два варианта MS Word файла, хранящиеся в Source Control TFS Visual Studio 2010 или Visual Studio 11?
Некоторые разработчики на проекте уже настроили Diff и Merge под себя. Мы решили поделиться этими знаниями как с командой, так и с Интернет-аудиторией.
Во-первых, есть замечательное коммерческое средство для сравнения основных форматов офисных документов – Diff Doc.
Во-вторых, Diff и Merge конфигурируются через VisualStudio IDE, которая позволяет выполнить программу с такими параметрами командной строки:
Tools > Options > Source Control > Visual Studio Team Foundation > Кнопка Configure User Tools…
Итак, для сравнения офисных документов c помощью приложения Diff Doc необходимо настроить следующие параметры:
- Extention: .docx
- Operation: Compare
- Command: “C:Program Files (x86)Softinterface, IncDiffDocDiffDoc.exe”
- Arguments: /M%1 /S%2
На практике это будет выглядеть так:
В зависимости от того, выбрали Вы Compare или Merge, в командной строке может быть использовано два или более параметра:
%1 | Исходный файл сравнения (серверный) или “их”- файл, в случае 3-стороннего слияния |
%2 | Модифицированный файл сравнения (локальный) или “ваш”- файл, в случае 3-стороннего слияния |
%3 | Параметр используется для 3-стороннего слияния, чтобы указать на “общего прородителя” для “ваших” и “их” изменений |
%4 | Заголовок для файла с результатом слияния, – файл, куда Merged-приложение должно сохранить результат |
%5 | Дополнительные аргументы для Diff-приложения (примениемо только, если вы исполььзуете tf diff /options” из командной строки) |
%6 | Заголовок для файла %1 |
%7 | Заголовок для файла %2 |
%8 | Заголовок для файла %3 |
%9 | Заголовок для файла %4 |
В-третьих, многие Open Source системы версионности (например SVN) уже в стандартной поставке интегрируются с офисными приложениями с помощью скриптов. Здесь можно подробней ознакомится с тем, как это делается в Tortoise SVN.
Помимо DiffDoс, сам MS Word имеет замечательное средство для сравнения и слияния двух документов с включенным в них «Track Changes». Это команда «Compare» в закладке «Review»:
Эта команда доступна через COM-интерфейс MS Word. Рассмотрим интеграцию подробней на примере скрипта, написанного нашим специалистом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
/**************************************************** Name: diff-doc.js extensions: doc;docx;docm Diff script for document files in MS Word 2007 and up Usage: WScrpt "diff-merge-doc.js" {NewFile} {BaseFile} Author: Alexandr Logvinenko, ALG Systems Inc, (c) 2012 *****************************************************/ function criticalError(sMsg) { // A function to report the error message(in the argument) and quit WScript.Echo(sMsg); WScript.Quit(1); } var argv = WScript.Arguments; // Command-line arguments, passed to the script if (argv.length != 2) criticalError('Two files are required for comparison!'); //Compare only if 2 arguments supplied var sNewDoc = argv(0); // New document is the first argument (%1) var sBaseDoc = argv(1); // Base document is the second argument (%2) var word; // MS Word Application instance try { // Try to create an invisible MS Word Application instance word = WScript.CreateObject('Word.Application'); } catch (e) { // Report and quit, if no MS Word installation found criticalError('MS Word is not installed!'); } if (parseInt(word.Version) < 12) criticalError('Only MS Word 2007 and up are supported!'); //12 stands for version of MS Office 2007 var destination = word.Documents.Open(sNewDoc, true, true); // Open the New document as the comparison destination destination.ActiveWindow.View.Type = 1; // Change the View Type property of document (1 stands for NormalView) try {// Try to compare New document to the Base document and creating new document 'Comparison' destination.Compare(sBaseDoc, 'Comparison', 2, true, true); //2 stands for CompareTargetNew } catch (e) { // Report and quit if comparison failed word.Quit(); // Exit MS Word application criticalError('Failed to compare ' + sBaseDoc + ' and ' + sNewDoc + '!'); } destination.Close(0); // Close the first document without changes (0 stands for DoNotSaveChanges) word.Visible = true; // Finally, show the MS Word Application window with comparison result word.Activate(); // and activate it |
Теперь нужно настроить Visual Studio на запуск нашего скрипта для Compare:
- Extention: .docx
- Operation: Compare
- Command: ” C:WindowsSystem32wscript.exe “
- Arguments: “C:diff-doc.js” %1 %2 //E:javascript
Цель достигнута – мы имеем возможность сопоставлять и объединять разные версии одного документа.
Во второй части статьи мы расскажем, как настраивать другие популярные приложения для использования Diff и Merge из TFS Visual Studio 2010 или Visual Studio 11, WinMerge, Beyond Compare, Araxis, Beyond Compare, TortoiseMerge, Visual SlickEdit. Кроме этого мы рассмотрим улучшения Diff и Merge в новом релизе Visual Studio 11.