5

정적 CA는 솔루션 빌드 mutch를 느리게 만듭니다. 내 경우에는 CA가없는 것보다 2 배 이상 느립니다. 우리는 그것을 막을 수는 있지만 그 힘을 잃는 것은 나쁜 결정입니다. 그래서 우리는 무엇을 할 수 있습니까?코드 분석 향상

먼저 CA의 작동 방식을 확인하십시오.

솔루션을 빌드하십시오. msbuild 후 각 프로젝트 빌드 컴파일 대상 fxcopcmd.exe는 분석해야하는 어셈블리에 대한 경로와 함께 호출됩니다. fxcopcmd. VS (또는 아마도 출력 스트림)에 의해 사용되는 CA xml 로그를 생성합니다. fxcopcmd.exe는 (빠른) 어셈블리를로드하고 동 기적으로 분석하므로 하나의 CPU 만로드되고 3 개 (제 경우)는 아무 작업도 수행하지 않습니다. CA가 완료된 후에 만 ​​프로젝트 종속성 체인의 다음 프로젝트가 빌드됩니다.

CA의 취약점으로 인해 모든 CPU를 병렬로 작동하도록 개선 할 수있었습니다.

내가 같은 솔루션을 참조

, MSBUILD에서 매개 변수를 기억하고 즉시 CA의 xml.log을 통해 (모두 확인하고 오류가 없었다 msbuild를보고 할 것이다 가짜 fxcopcmd.exe를 만들려면, 또는 성공한 파일, 아니면 스트림 ..). 따라서 MSBUILD는 다음 프로젝트를 빌드하고 그 시간에 저장된 매개 변수로 실제 fxcopcmd.exe를 호출합니다 ... MSBUILD가 다음 프로젝트에서 fxcopcmd.exe를 호출하면 - fxcopcmd.exe를 한 번 더 호출합니다. 모든 CPU를로드 할 프로세스는 거의 없습니다. 실제 fxcopcmd.exe가 끝나면 MSBUILD 대상을 호출 할 수 있습니다. MSBUILD 대상은 microsoft.common.targtets에서 CA 대상 만 호출하고 컴파일은하지 않으며 가짜 fxcopcmd.exe는 즉시 결과를보고합니다 (CA는 그 시점에 완료되고 로그가 있습니다) MSBUILD-VS.

당신은 어떻게 생각하십니까? 이 속도가 CA가 될까요? 왜 Microsoft는 그러한 직원을 만들지 않고 CA에서 하나의 CPU 만 사용 했습니까?

+0

왜 다른 빌드 구성을 만들고 그 설정 만 활성화합니까? 그런 다음 빌드 할시기를 선택할 수 있습니다. –

답변

4

나는 한 번 similar question on Connect and got a reply directly from the team을 물었습니다. 2012 년 ALM 정상 회의에 나는 주제를 논의하고 프로젝트 로슬린은 비주얼 스튜디오 제품에 통합 일단 코드 분석 엔진은 대부분 대체됩니다

  • (특별한 순서없이) 이유가 있었다. Roslyn은 Resharper와 같은 실시간 분석과 발견 된 문제를 '고칠 수있는 능력'을 제공 할 것입니다.
  • 엔진은 CPU를 매우 많이 사용하기 때문에 이미 여러 CPU를 사용하므로 여러 인스턴스를 실행하면 예상 한 것만큼이나 도움이되지 않을 수 있습니다. 또한 fxcop은 매우 많은 I/O 집약적 인 (어셈블리, pdb 및 기타 파일로드) 될 수 있습니다. 이는 동시에 여러 인스턴스를로드 할 때만 악화됩니다.
  • 빌드 엔진은 빌드 출력에 액세스해야합니다. 참조뿐만 아니라 다른 작업에도 사용됩니다. 따라서 작업이 완료 될 때 파일이 더 이상 사용되지 않는다는 것을 알아야합니다. 예를 들어, 이후에 이전 어셈블리를 제거하는 많은 어셈블리를 Ilemerges하는 태스크를 추가하면 해당 어셈블리에 액세스해야합니다. 간단한 이동/패키지/etc 작업에도 동일하게 적용됩니다.
  • 코드 분석 문제 (레벨 = 오류로 설정 됨)가 발견 될 때 빌드를 초기에 실패 할 수있는 능력은 사용자가 맨 끝에 만 결과를 수집하기 때문에 작동하지 않습니다. 아마도 모든 것을 구축해야 할 뿐이며 최종 결과를 사용할 수 없다는 것을 알게됩니다. 당신이 this MSDN forum post 여기에서 볼 수 있듯이

는합니다 FxCop 자체는 이미 여러 스레드와를 사용하여 이미 그에서의 FxCop에 대한 동시성을 해제 할 우리의 원인이 동시성과 몇 가지 문제가 (적어도 2010과 함께 제공되는 규칙) 어떤 경우.당신이 이상 (이하) 스레드를 사용합니다 FxCop하려는 경우, 당신은 fxcopcmd.exe.config 파일을 편집 할 수 있습니다

<FxCopEngineSettings Version="1.32"> 
    <Engines> 
    <Engine Name="Introspection" Enabled="True"> 
     <!-- Change this number to use more (or fewer) threads --> 
     <Threading Count="1" /> 
     <EnableFlowAnalysis>True</EnableFlowAnalysis> 
    </Engine> 
    </Engines> 
</FxCopEngineSettings> 

를 포럼 게시물은 비주얼 스튜디오 2008을 언급하지만, 나뿐만 아니라 2010 문제를 해결하려면이 옵션을 적용했습니다.

FxCop을보다 효율적으로 만드는 가장 간단한 방법은 모든 프로젝트를 컴파일 한 후에 한 번 호출하는 것입니다. 이렇게하면 모든 심볼과 참조 된 어셈블리 만로드되고 엔진은 병렬 처리를 최대한 활용할 수 있습니다. 여러 대상 플랫폼과 CPU를 혼합하거나 다른 프로젝트에 다른 .rules 파일을 사용하려는 경우이 문제가 있습니다.

또는 로컬 솔루션에 대해 FxCop을 구성하는 것과 동일한 작업을 수행 할 수 있지만 각 빌드에서 실행되도록 설정하지는 마십시오. 그런 다음 Team Foundation Server Team Build (또는 사용할 수있는 다른 빌드 서버)에서 "Always"를 실행하도록 FxCop의 구성을 재정의합니다. 그렇게하면 로컬 솔루션을 구축하는 동안 성능에 영향을 미치지 않습니다. 여전히 분석 도구 메뉴 항목에서 전체 솔루션에 대한 코드 분석을 로컬로 실행할 수 있으며 자동화 된 빌드는 문제가있는 코드를 체크인하는 것을 막을 수 있습니다.