2012-12-20 38 views
5

Tôi có tệp MSBuild xây dựng * / tệp .sln (xây dựng tất cả các tệp .sln tồn tại).Chỉ chạy mục tiêu MSBuild nếu dự án thực sự được xây dựng

Bản dựng sử dụng mục tiêu Xây dựng, vì vậy nếu không có thay đổi nào được thực hiện đối với tệp nhập, không nên tạo lại dự án.

Tôi muốn thực hiện một số mục tiêu tùy chỉnh chỉ khi dự án thực sự được xây dựng lại.

Làm cách nào để thực hiện điều này?

Cả AfterBuildAfterCompile luôn luôn được gọi, bất kể nếu biên dịch/xây dựng thực sự diễn ra.

+0

là mục tiêu đó trong mọi tệp dự án, hoặc là nó trong tệp projet seperat cũng thuộc về giải pháp? – stijn

+0

Tập tin dự án riêng biệt –

+0

có vẻ hơi khó hơn .. ngoài ra, bạn có muốn mục tiêu được xây dựng khi bất kỳ dự án nào khác được xây dựng hay khi tất cả các dự án được xây dựng hay ...? – stijn

Trả lời

5

Về cơ bản bạn muốn hành vi tương tự như PostBuildEvent ví dụ, vì vậy tôi nhìn lên như thế nào Microsoft.Common.Targets nó (tập tin này luôn cung cấp một cái nhìn sâu sắc ngơi thoải mái tại như thế nào msbuild là nghĩa vụ phải được sử dụng). Dưới đây là giải pháp:

<PropertyGroup> 
    <RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent> 
</PropertyGroup> 
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> 
<Target Name="RunWhenBuild" AfterTargets="CoreBuild"  
     Condition="'$(_AssemblyTimestampBeforeCompile)'!='$(_AssemblyTimestampAfterCompile)'"> 
    <Message Importance="high" Text="RunWhenBuild!!"/> 
</Target> 

Và đây là những gì diễn ra trên: khi có một tài sản có tên RunPostBuildEvent với một giá trị của OnOutputUpdated dependncies các CoreBuild mục tiêu cuối cùng sẽ ghi dấu thời gian của tập tin đầu ra trước và sau khi xây dựng. Và nếu chúng bằng nhau, đầu ra không được xây dựng. Vì vậy, tất cả những gì còn lại là nhận được mục tiêu của bạn để chạy sau CoreBuild và kiểm tra trên các dấu thời gian này.

+0

Dường như về quyền. Tôi sẽ kiểm tra điều này! thanks –

+0

Phần tử có bắt buộc ở đây không? –

+0

có, đó là tiêu chuẩn (bắt buộc đối với C#) nhập gần cuối mỗi tệp csproj. Nếu không có nó, bạn không thể (dễ dàng) xây dựng các ứng dụng C# – stijn

Các vấn đề liên quan