19

tôi đã xác định nhiều AfterBuild - Nhiệm vụ trong dự án Visual Studio của tôi với điều kiện khác nhau:Thứ tự các tác vụ AfterBuild trong các dự án Visual Studio ...?

<Target Name="AfterBuild" Condition="'$(Configuration)'=='FinalBuilder'"> 
    <Message Importance="high" Text="--- AfterBuild for FinalBuilder ---" /> 
</Target> 
<Target Name="AfterBuild" Condition="'$(MvcBuildViews)'=='true'"> 
    <Message Importance="high" Text="--- AfterBuild for MvcBuildViews ---" /> 
</Target> 

Nhưng chỉ người cuối cùng được thực hiện nếu trận đấu điều kiện. Nếu tôi chọn FinalBuilder-Configuration, các tác vụ AfterBuild sẽ bị bỏ qua và không được thực hiện. Nếu tôi thay đổi thứ tự của các mục tiêu trong các tệp dự án (Điều kiện = "'$ (Cấu hình)' == 'FinalBuilder'" là cuối cùng), AfterBuild cho FinalBuilder-Configuration được thực hiện nhưng một cho MvcBuildViews bị bỏ qua.

Thứ tự của mục tiêu có quan trọng không? Chỉ có tác vụ AfterBuild cuối cùng được đưa vào tài khoản? Hoặc làm cách nào tôi có thể xác định các tác vụ AfterBuild khác nhau với các Điều kiện khác nhau?

Cảm ơn

Konrad

Trả lời

30

Là người duy nhất thứ hai được thực hiện vì nó được định nghĩa lại. Xem MSDN (Khai báo các mục tiêu trong chương tệp dự án).

Bạn nên sử dụng chỉ có một mục tiêu AfterBuild trong hồ sơ dự án của bạn như thế này:

<Target Name="AfterBuild" > 
    <Message Condition="'$(MvcBuildViews)'=='true'" Importance="high" Text="--- AfterBuild for MvcBuildViews ---" /> 
    <Message Condition="'$(Configuration)'=='FinalBuilder'" Importance="high" Text="--- AfterBuild for FinalBuilder ---" /> 
</Target> 

EDIT: Hoặc sử dụng CallTarget nhiệm vụ:

<Target Name="AfterBuild" > 
    <CallTarget Condition="'$(MvcBuildViews)'=='true'" Targets="MvcBuildTarget" /> 
    <CallTarget Condition="'$(Configuration)'=='FinalBuilder'" Targets="FinalBuilderTarget" /> 
</Target> 

<Target Name="MvcBuildTarget"> 
    <Message Importance="high" Text="--- AfterBuild for MvcBuildViews ---" /> 
</Target> 

<Target Name="FinalBuilderTarget" > 
    <Message Importance="high" Text="--- AfterBuild for FinalBuilder ---" /> 
</Target> 
+0

Cảm ơn bạn. Là một cách để làm tổ khối cho mọi điều kiện - để tôi không phải viết mệnh đề điều kiện trong mỗi mục duy nhất? – Konrad

+0

Bạn có thể sử dụng nhiệm vụ CallTaget. Tôi đã cập nhật câu trả lời của mình. – Ludwo

+0

Oh cảm ơn ... hoàn hảo :-) – Konrad

2

Nếu bạn thực sự cần phải chạy nhiều nhiệm vụ AfterBuild (điều này có thể là trường hợp ví dụ nếu bạn cần các bộ Nhập và Xuất khác nhau cho mỗi tác vụ), bạn có thể sử dụng DependsOnTarget để chỉ đơn giản là làm cho AfterBuild phụ thuộc vào tất cả chúng:

<Target Name="AfterBuild1" 
    Inputs="stuff" 
    Outputs="stuff"> 
     <Message Text="Running first after build task." Importance="high" /> 
     <Exec Command="stuff" /> 
    </Target> 
    <Target Name="AfterBuild2" 
    Inputs="other stuff" 
    Outputs="other stuff"> 
     <Message Text="Running other after build task." Importance="high" /> 
     <Exec Command="stuff" /> 
    </Target> 
    <Target Name="AfterBuild" DependsOnTargets="AfterBuild1;AfterBuild2" /> 

Nếu bạn cần hạn chế thứ tự của chúng, chỉ cần thực hiện AfterBuild2 phụ thuộc vào AfterBuild1 với DependsOnTargets="AfterBuild1".