─━ IT ━─

Visual Studio .NET에 diff 지원 기능 추가하기

DKel 2021. 8. 16. 01:12
반응형
처음에 소스 코드를 쓰고 있는 개발 시에는 여러 버전의 파일이 완성되기 때문에 양자 간의 차분을 잡고 변경 부분을 확인하고 싶은 경우가 자주 있습니다.그러나 Visual Studio .NET의 IDE 환경에서 표준 메뉴 명령에는 이 기능이 보이지 않습니다.통상, 이러한 케이스에서는 「diff」라고 하는, Unix 환경에서는 스테디셀러의 툴을 사용합니다(Win32판의 「diff.exe」도 있습니다).Windows에서는 이를 본뜬 WinDiff라고 하는 GUI 툴이 Visual Studio 나 Resource Kit 등에 부속되어 있습니다.그러나, 이것들을 사용하기 위해서는, 그때마다 데스크탑으로 돌아가,
애플리케이션을 기동하고,
비교하는 파일을 선택하는 작업을 반복해야 하기 때문에 상당히 번거롭습니다.이 문제를 편하게 하기 위한 작은 Visual Studio .NET 매크로를 소개합니다.대상 독자 Visual Studio 2002 이상을 대상으로 하고 있습니다.필요한 환경 Visual Studio 2002가 필요합니다.2003에서는 검증하지 않았지만 괜찮다고 생각합니다.매크로란 매크로는 조작의 순서를 기술하고, 정형 작업을 자동화하기 위한 기능입니다.Excel의 VBA와 마찬가지로 Visual Studio에도 VBA와 같은 것이 붙어있습니다.다만 Visual Studio의 경우 Visual Basic.NET에서 기술합니다.이번에 작성하는 매크로의 개요 WinDiff는 GUI 툴입니다만, 커맨드 프롬프트로부터 기동할 수 있습니다.2개의 파일을 비교할 경우, 기동 옵션으로 비교하는 2개의 파일 패스를 줄 뿐입니다.이 예에서는 「C:WinDiff.Exe」라고 하는 패스에 인스톨 되어 있다고 상정합니다.명령 프롬프트에서 부팅
C:WinDiff.exe ′c: ile1.txt′ ′c: ile2.txt′이로부터 매크로의 설계로서는 다음과 같이 됩니다.솔루션 탐색기에서 선택 중인 2가지 파일 경로 정보 가져오기
2 개의 파일 패스를 인수로 한 커맨드 문자열을 작성해 「WinDiff.exe」의 프로세스를 기동할 준비[툴]→[매크로]→[매크로 IDE...]를 실행해, 매크로 IDE 를 기동합니다.프로젝트 탐색기에서 「My Macros」를 오른쪽 클릭해,[추가]→[모듈의 추가]를 클릭하고 모듈을 추가합니다.′Public Module~′ 섹션을 이미 기술했기 때문에 이 안에 매크로 루틴을 쓰도록 하겠습니다.매크로의 구현 우선 VS 매크로에서는 DTE(Development Tools Extensibility)라고 하는 IDE 환경을 확장하기 위한 글로벌 객체가 준비되어 있고 이 객체를 트리 위로 올라가면 개발 환경에 존재하는 방대한 객체를 조작할 수 있습니다.코드의 포인트인데 먼저 솔루션 탐색기에서 선택한 파일이나 폴더의 정보를 가져오기 위해서는 DTE 객체의 Selected Items 속성을 사용합니다.나머지는 취득한 것을 For Each로 루프하여 항목이 Project Item 객체인 경우 File Names (1)에서 완전 경로를 참조할 수 있습니다.속성이 배열형으로 되어 있는 것은, 선택하고 있는 프로젝트의 항목에 따라서는, 관련지어져 있는 파일이 여러 개가 될 수도 있기 때문입니다.단, 대부분의 경우 프로젝트 항목 하나에 파일 파일 하나를 가지고 있습니다.파일명을 얻은 후에는 명령어 문자열을 만들어 System.Diagnostics.Process를 사용해 프로세스를 실행하기만 하면 됩니다.파일 비교 도구 부팅 매크로
Sub Windiff _ CompareFiles ( )
실행경로는 개인의 각 환경에 따라 필기해야 합니다.
Dim diffPath As String = ′ C : Program Files Tools Bin WinDiff . Exe ′
Dim SelItem As SelectedItem
Dim argStr As String

′2개의 아이템이 선택되었음을 확인
If ( DTE . SelectedItems . Count < > 2 ) Then Exit Sub

For Each SelItem In DTE . SelectedItems
프로젝트 내의 아이템이라면 처리한다
If ( Not SelItem . ProjectItem Is Nothing ) Then
argStr = argStr + ′′′′ _
+ SelItem . ProjectItem . FileNames ( 1 ) + ′′′ ′
End If
Next

Dim proc As System . Diagnostics . Process _
= New System . Diagnostics . Process ( )
proc . StartInfo . FileName = diffPath
proc . StartInfo . Arguments = argStr
proc . StartInfo . WindowStyle = ProcessWindowStyle . Normal
proc . Start ( )

End Sub 툴바에 등록 매크로를 만들면 툴바에 등록을 합시다.이제 2개의 파일을 선택하고 툴바에서 버튼을 클릭하면 WinDiff가 비교를 해줍니다.DF 그런데, WinDiff도 꽤 좋습니다만, 보다 고기능으로 사용하기 쉬운 「DF」라고 하는 훌륭한 프리 소프트를 여기에서는 다루기로 하겠습니다.이 툴도 WinDiff와 같이, 비교할 때는 2개의 파일 패스를 인수로 취하기 때문에, 실행 패스를 이 DF를 인스톨 한 장소에 옮겨 쓰면, 상기의 매크로를 그대로 사용할 수 있습니다.마지막으로Visual Studio에는매크로기능이있습니다.과문해서 VS의 매크로를 알뜰하게 활용하고 있다는 소문은 별로 듣지 않습니다만 의외로(?) 쓸모가 있습니다.어떤 것을 사용하지 않는 것도 아까우니까, 아이디어에 따라서 여러가지 활용해서, Code Zine에도 그 아이디어를 투고해 주세요!참고자료 DTE 객체
ProjectItem 객체
반응형