2010-10-16 23 views
7

Tôi muốn chạy một MSBuild Task (có ký hiệu một tệp thi hành/dll) nhưng chỉ khi đầu ra exe/dll đã thay đổi. Nếu không có tệp nguồn nào đã thay đổi gây ra một biên dịch lại của tệp exe/dll thì tôi không muốn tác vụ đó chạy.Làm cách nào để bạn có thể chạy tác vụ MSBuild chỉ khi kết quả đầu ra của dự án của bạn đã được xây dựng?

Mặc dù dành nhiều giờ để thử những thứ khác nhau nhưng tôi không thể tìm ra cách để tác vụ đích chỉ chạy nếu dự án đã được biên dịch ở nơi tệp đầu ra đã thay đổi (nói cách khác mục tiêu CoreCompile không bị bỏ qua) .

Trả lời

2

nên được giống như this answer, sử dụng TargetOutputs parameter ::

<MSBuild Projects="File.sln" > 
    <Output TaskParameter="TargetOutputs" ItemName="AssembliesBuiltByChildProjects" /> 
</MSBuild> 
<Message Text="Assemblies built: @(AssembliesBuiltByChildProjects)" /> <!-- just for debug --> 
<CallTarget Targets="SignExe" Condition="'@(AssembliesBuiltByChildProjects)'!=''" /> 
+0

Tôi nghĩ đây là một cách tiếp cận khác - tôi đang cố gắng hiểu cách thực hiện điều này trong ngữ cảnh của tệp dự án .csproj cho dự án thông thường - không tạo tệp dự án MSBuild nhắm mục tiêu giải pháp –

0

Bạn chỉ có thể làm điều này:

<PropertyGroup> 
    <TargetsTriggeredByCompilation>DoStuffWithNewlyCompiledAssembly</TargetsTriggeredByCompilation> 
</PropertyGroup> 

này hoạt động vì có người thông minh tại Microsoft thêm dòng sau vào cuối của mục tiêu CoreCompile trong Microsoft.[CSharp|VisualBasic][.Core].targets (tên tệp phụ thuộc vào ngôn ngữ và phiên bản MSBuild/Visual Studio).

<CallTarget Targets="$(TargetsTriggeredByCompilation)" Condition="'$(TargetsTriggeredByCompilation)' != ''"/> 

Vì vậy, nếu bạn chỉ định một tên mục tiêu trong TargetsTriggeredByCompilation tài sản, mục tiêu của bạn sẽ chạy nếu CoreCompile runs-- và mục tiêu của bạn sẽ không chạy nếu CoreCompile được bỏ qua (ví dụ vì lắp ráp đầu ra đã được up-to- ngày đối với mã).

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