2009-05-12 1 views
11

고도로 참조 된 클래스를 한 네임 스페이스에서 다른 네임 스페이스로 옮기려고합니다. 파일을 새 네임 스페이스가있는 새 프로젝트로 이동하면 솔루션 전체에서 1100 개가 넘는 오류가 발생합니다.고도로 참조 된 클래스의 네임 스페이스를 변경하는 가장 좋은 방법은 무엇입니까?

클래스에 대한 일부 참조는 정규화 된 namescape 참조를 포함하고 다른 일부는 네임 스페이스 가져 오기와 관련됩니다.

리팩토링 도구 (Refactor Pro)를 사용하여 네임 스페이스의 이름을 바꾸려고 시도했지만 클래스에 대한 모든 참조가 바뀌기를 바랬지 만 앞서 언급 한 문제가 발생했습니다.

누구나 수동으로 모든 파일을 드릴링하고 정규화 된 네임 스페이스를 변경하거나 새로운 네임 스페이스가없는 경우이 파일을 가져 오지 않고이 문제를 해결할 수있는 방법을 알고 싶습니다.

감사합니다.

+1

이 문제를 일으키는 사람들에게. 나는 Resharper를 시도했다. 그것은 진짜 물건을 엉망으로 만들었다. 결국 기본 '파일에서 바꾸기'가 작업을 수행했습니다. 이를위한 기법은 우선적으로 자격이되는 모든 참조를 대체 한 다음 덜 자격을 부여한 다음 수동으로 수입을 수정하는 것이 었습니다. 이것은 30 분 모두 나를 데려 갔다. 교차 절단 우려는 고통입니다. – Llyle

답변

5

사용 시도 Resharper. 완전히 참조 된 이름 공간과 전혀 가져 오지 않은 참조 된 네임 스페이스 모두 리펙토링하기 위해 과거에 사용했습니다.

+0

확실히 옵션, 나는 네임 스페이스 변경을 위해 많은 현금을 포크 할 필요가 없다.) – Llyle

+1

Resharper는 비싸지 만, 지금은 없이는 살 수 없다. – CodeLikeBeaker

+1

현금이 아닙니다. 그것은 일주일 만에 스스로를 지불합니다. –

1

귀하의 경우에 도움이 될만한 것이 없다면 나는 그렇지 않습니다.

  1. 네임 스페이스를 수정하면 VS IDE가 네임 스페이스의 끝에 작은 빨간색 사각형을 표시합니다.
  2. Ctrl +를 누릅니다. 가장 좋아하는 옵션을 선택하십시오.

ReSharper와 같은 도구를 사용하는 경우 네임 스페이스를 클릭하고 Ctrl + R을 누릅니다. Rename Namespace 대화 상자의 지시를 따릅니다.

+0

이것은 정확히 피하고 싶습니다. 1100 + 오류를 수정하기 위해 각 파일에 들어가는 것은 개발자의 시간을 매우 생산적으로 사용하는 것처럼 보이지 않습니다. – Llyle

+0

수정하지 않아도됩니다. VS 또는 ReSharper가 귀하를 위해 리 팩터를 실행합니다. 동일한 네임 스페이스를 사용하는 모든 파일에서 한 개의 파일 만 네임 스페이스를 수정하고 네임 스페이스는 수정해야합니다. – Vadim

+2

Visual Studio 2008 Standard Edition을 사용하여 각각의 1100+ 오류를 수정하는 것은 수동 프로세스이며 많은 시간이 필요합니다. ReSharper는 옵션이지만 네임 스페이스를 변경하기위한 또 다른 리펙토링 도구를 추가하면 과도한 것처럼 보입니다. – Llyle

1

글로벌 검색을 수행하고 정규화 된 이름으로 바꾸는 데 너무 많은 어려움을 겪지 않아야합니다. 따라서 oldspace :: myclass에서 모두 검색하고 newspace :: myclass로 바꿉니다. 파일의 상단에 라인을 추가하거나 몹시 어려운 일이 아니다, 당신은 아마도 물론이 같은 접근 방식, 몇 가지 위험이있다

using oldspace; 
using newspace; 

using oldspace; 

을 대체 할 수있다. 미묘한 문제가 발생하기 쉽습니다.

+0

처음에는 C 기반 언어가 아닌 VB입니다.하지만 둘 다 지정하는 아이디어는 정규 표현식 전역 대체로 수행 할 수 있습니다. 하지만, 네임 스페이스가 두 번 반입되는 곳에서 500 개 이상의 오류가 발생합니다. :) – Llyle

+0

아, 죄송합니다. 태그를 놓치고 질문에 지정하지 않았습니다. 검색 및 교체 솔루션이 30 분 이상 걸리면 보통 특정 상황을 처리 할 수있는 맞춤 검색 및 교체 도구를 직접 작성합니다. 누군가가 이미 당신이 필요로하는 도구를 쓴 것처럼 들리므로, 당신이 돈을 지불할지 여부를 결정해야합니다.). – AHelps

4

고통스러운 네임 스페이스 이름 바꾸기를 수행하는 데 사용한 Powershell 스크립트는 다음과 같습니다. 내 상황에는 공통 라이브러리 (CSLA)를 많이 사용하는 약 5000 개의 VB.Net 및 C# 소스 파일이있었습니다. 논할 가치가없는 이유로 네임 스페이스의 이름을 바꿔야합니다. Csla ~ CslaLegacy. 최소의 노력으로이 스크립트를 특정 요구에 맞게 조정할 수 있어야합니다. 이 스크립트는 .vb 및 .cs 파일을 찾는 소스 트리를 반복적으로 검색합니다. $ repValues ​​해시 테이블에는 교체해야하는 문자열이 들어 있습니다. 이 스크립트의 변형을 사용하여 어셈블리 이름 변경이 포함 된 프로젝트 참조를 업데이트 할 수도 있습니다. 수정하기 전에 소스 제어 도구에 호출을 추가하여 파일을 체크 아웃 할 수 있습니다. 원래 TFS에서이 작업을 수행했지만 tf.exe를 실행하는 속도가 느린 것으로 나타났습니다. 결국 스크립트를 실행하기 전에 전체 소스 트리를 체크 아웃하는 것이 훨씬 더 빠릅니다. 필자는 PowerGUI 스크립트 편집기를 사용하여 디버거를 실행하고 powershell 스크립트를 실행합니다.

$root = "c:/path/to/your/source" 

cd $root 
$files = Get-ChildItem -Path $root -Recurse -include *.cs,*.vb 

$repValues = 
@{ 
'using Csla;'    = 'using CslaLegacy;'; 
'using Csla.Validation;' = 'using CslaLegacy.Validation;'; 
'using Csla.Data;'   = 'using CslaLegacy.Data;'; 
'Imports Csla'    = 'Imports CslaLegacy'; 
'Imports Csla.Validation' = 'Imports CslaLegacy.Validation'; 
} 

$stmtsToReplace = @() 
foreach ($key in $repValues.Keys) { $stmtsToReplace += $null } 
$repValues.Keys.CopyTo($stmtsToReplace, 0) 

foreach ($file in $files) 
{ 
$path = [IO.Path]::Combine($file.DirectoryName, $file.Name) 

$sel = Select-String -Pattern $stmtsToReplace -Path $path -l 

if ($sel -ne $null) 
{ 
    write "Modifying file $path" 

    (Get-Content -Encoding Ascii $path) | 
    ForEach-Object { 
     $containsStmt = $false 
     foreach ($key in $repValues.Keys) 
     { 
      if ($_.Contains($key)) 
      { 
       $_.Replace($key, $repValues[$key]) 
       $containsStmt = $true 
       break 
      } 
     } 
     if (!$containsStmt) { $_ } 
    } | 
    Set-Content -Encoding Ascii $path 
} 
} 
-1

또 다른 이유는 예리하다. VS 2008에서 무료로 빌트인 소스 코드 리펙토링.

관련 문제