2014-12-14 2 views
1

다른 클래스 라이브러리 프로젝트 (EdmResources 참조 프레임 워크)를 참조하는 C# 클래스 라이브러리 프로젝트가 있습니다. EdmResources에는 프로젝트가 빌드 될 때 항상 실행되는 Entity Framework 용 EDMX 파일을 컴파일하고 작성하는 T4 템플릿 만 포함됩니다.증분 빌드 MSBuild 타임 스탬프 문제

EdmResources 프로젝트는 Framework 어셈블리가 최신인지 또는 빌드해야하는지에 관계없이 항상 빌드됩니다. 이로 인해 빌드 프로세스가 많이 느려지 게됩니다. 내가 원했던 것은 EdmResources가 프레임 워크 어셈블리를 다시 컴파일해야하는 경우에만 빌드하는 것이다.

프레임 워크 어셈블리의 마지막 쓰기 시간을 EdmResources.tt의 출력으로 출력하려고 시도했지만 어셈블리의 마지막 쓰기 시간이 템플릿의 출력 파일에 기록 된 타임 스탬프보다 큰 경우에만 EDMX 생성을 수행합니다 .

MSBuild가 변경 사항이없고 코드가 다시 컴파일되지 않아도 Framework 어셈블리의 마지막 쓰기 시간을 항상 업데이트하기 때문에 이것은 작동하지 않습니다.

기본적으로 실제 빌드 타임 스탬프를 반영하는 Framework 프로젝트를 빌드하는 동안 MSBuild에서 신호 파일을 생성 할 수 있습니까? IE는 일부 코드가 실제로 다시 컴파일 될 때만 업데이트됩니다. 그런 다음이 파일을 Framework 어셈블리의 마지막 쓰기 시간 대신 사용할 수 있습니다.

감사합니다.

+0

이것은 공정한 질문이지만, 항상 빌드 서버의 모든 것을 다시 작성하는 것을 선호합니다. 그 한 프로젝트에 왜 빌드 프로세스가 오래 걸리는지 조사해 보셨습니까? – wal

+0

T4/Edmx/Entity에 익숙하지 않지만 (항상 프로젝트가 항상 빌드되는 리소스를 생성하면서) 한 번 비슷한 문제가 발생하고 System.IO.File을 수행하는 CodeTaskFactory로 msbuild 작업을 수행하여 해결했습니다. .SetLastWriteTime (DestFile, System.IO.File.GetLastWriteTime (SourceFile));'. 이와 비슷한 항목이 유용 할 수 있습니다. 즉, 파일의 타임 스탬프를 '오래되었습니다'라고 알리는 것으로 강제 설정하는 것일 수 있습니다. – stijn

+0

우리는 항상 빌드 서버의 모든 것을 다시 빌드합니다. 문제는 개발자가 테스트를 작성하고 테스트 프로젝트를 다시 컴파일하기를 원할 때입니다. 때로는 VS가 올바른 결과를 얻고 테스트 프로젝트를 다시 컴파일하지만 가끔은 모든 참조가 먼저 처리됩니다. 이는 다른 참조가 최신 상태 일 때라도 리소스 프로젝트가 항상 빌드되도록 트리거합니다. 이는 최적화가 필요한 것입니다. – Sam

답변

0

좋은 해결책을 발견했습니다. 나는 상단에 내 프레임 워크 프로젝트 파일에이 코드를 넣어 :

<!-- This target will be called by CoreCompile only when it runs --> 
<Target Name="AfterCompilation" > 
    <!-- Output Timestamp File --> 
    <ItemGroup> 
     <SignalFile Include="$(OutDir)MyCompany.Framework.timestamp" /> 
    </ItemGroup> 
    <PropertyGroup> 
     <Ticks>$([System.DateTime]::Now.Ticks)</Ticks> 
    </PropertyGroup> 
    <WriteLinesToFile File="@(SignalFile)" Lines="$(Ticks)" Overwrite="true" /> 
</Target> 

그래서이 타임 스탬프 파일 만 생성된다는 것을 의미합니다 :

<PropertyGroup> 
    <TargetsTriggeredByCompilation> 
     $(TargetsTriggeredByCompilation); 
     AfterCompilation 
    </TargetsTriggeredByCompilation> 
</PropertyGroup> 

그런 다음 파일의 맨 아래에있는 AfterCompilation 대상 추가 코드가 컴파일 될 때 CoreCompile 대상이 호출되지 않으면 타임 스탬프 파일이 업데이트되지 않습니다. 그런 다음 T4 템플릿에서이 타임 스탬프 파일을보고 내 EDMX 파일을 다시 작성해야하는지 정확하게 판단 할 수 있습니다.