2009-08-26 47 views
9

Tôi có kịch bản msbuild sau:Làm thế nào để gọi cùng một mục tiêu msbuild hai lần?

<?xml version="1.0" encoding="utf-8"?> 
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 
     DefaultTargets="All"> 

    <PropertyGroup> 
    ... 
    </PropertyGroup> 

    <UsingTask AssemblyFile="$(GallioTaskPath)" TaskName="Gallio.MSBuildTasks.Gallio" /> 
    <Import Project="$(MSBuildCommunityTasksPath)\MSBuild.Community.Tasks.Targets" /> 

    <ItemGroup> 
    ... 
    </ItemGroup> 

    <Target Name="CheckServerHostsItemGroup" 
      Condition="'$(NoServerHosts)' != True"> 
    ... 
    </Target> 

    <Target Name="RunServerHosts" DependsOnTargets="CheckServerHostsItemGroup" 
      Condition="'$(NoServerHosts)' != True"> 
    ... 
    </Target> 

    <Target Name="KillServerHosts" DependsOnTargets="CheckServerHostsItemGroup" 
      Condition="'$(NoServerHosts)' != True"> 
    ... 
    </Target> 

    <Target Name="KillServerHosts2" 
      Condition="'$(NoServerHosts)' != True"> 
    <MSBuild Projects="$(MSBuildProjectFile)" Targets="KillServerHosts" Properties="Configuration=$(Configuration)" /> 
    </Target> 

    <Target Name="All" DependsOnTargets="Build;RunServerHosts;Test;KillServerHosts2"> 
    <OnError ExecuteTargets="KillServerHosts2" /> 
    </Target> 

    <Target Name="Test"> 
    ... 
    <Error Text="Tests execution failed with exit code $(ExitCode)" Condition="'$(ExitCode)' != 0" /> 
    </Target> 

    <Target Name="CheckSolutionsItemGroup"> 
    ... 
    </Target> 

    <Target Name="Build" DependsOnTargets="CheckSolutionsItemGroup;KillServerHosts"> 
    ... 
    </Target> 

    <Target Name="Clean" DependsOnTargets="CheckSolutionsItemGroup;KillServerHosts"> 
    ... 
    </Target> 

</Project> 

Tôi đã gỡ bỏ các cơ quan trong những mục tiêu để tiết kiệm không gian và bởi vì họ là không thích hợp. Tuy nhiên, nếu ai đó nghĩ rằng họ là, tôi sẽ bao gồm chúng.

Dù sao, như người ta có thể thấy, có một mục tiêu - KillServerHosts, mà tôi muốn gọi hai lần và vì một lý do chính đáng. Một lần trước khi xây dựng, để đảm bảo không có hội đồng bị khóa và thời gian khác sau khi các bài kiểm tra hoàn thành để "dọn dẹp bảng".

Đương nhiên, cố gắng gọi mục tiêu KillServerHosts hai lần không hoạt động, MSBuild từ chối xây dựng cùng một mục tiêu hai lần. Vì vậy, tôi đang cố gắng để lừa dối bằng cách gọi mục tiêu KillServerHosts2. Vấn đề là đôi khi nó hoạt động và đôi khi nó không.

Nếu tôi chạy mục tiêu KillServerHosts từ dòng lệnh, nó luôn giết chết máy chủ lưu trữ có liên quan, do đó, từ khía cạnh này, nó hoạt động tốt.

Bất kỳ ý tưởng nào?

Trả lời

22

Theo thiết kế, các mục tiêu MSBuild không được thực hiện nhiều lần. Bạn không nên nghĩ về một mục tiêu MSBuild như một phương thức hay hàm, bucause MSBuild không phải là một ngôn ngữ lập trình hàm.

Nếu bạn muốn thực hiện mục tiêu nhiều hơn một lần, bạn có thể sử dụng tác vụ MSBuild để làm như vậy, chỉ cần chuyển vào một nhóm thuộc tính khác. Ví dụ một cái gì đó như thế này

<Target Name="SomeTarget"> 
    <MSBuild Projects="$(MSBuildProjectFile)" Targets="YourTarget" Properties="FakeProperty=one" /> 
    <MSBuild Projects="$(MSBuildProjectFile)" Targets="YourTarget" Properties="FakeProperty=two" /> 
</Target> 

Lưu ý: Tôi không thực sự cố gắng này ra vì vậy có thể có vấn đề cú pháp nếu tôi sai chính tả hoặc nhớ sai nhưng bạn sẽ có thể để làm cho nó làm việc.

+0

Thuộc tính phải là 'Dự án', không phải là 'Dự án'. Bằng cách đó, đề xuất của bạn hoạt động hoàn hảo, cảm ơn! –

+0

Tôi vừa sửa nó. –

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