次の msbuild スクリプトがあります。
<?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>
スペースを節約するため、またそれらは無関係であるため、ターゲットのボディを削除しました。しかし、誰かがそう思うなら、私はそれらを含めます。
とにかく、ご覧のとおり、1 つのターゲット - がKillServerHosts
あり、これを 2 回呼び出したいのですが、それには正当な理由があります。ビルドの前に 1 回、アセンブリがロックされていないことを確認するために、もう 1 回はテストの完了後に「テーブルをクリーンアップ」します。
当然、ターゲットを 2 回呼び出そうとしてKillServerHosts
も機能しません。MSBuild は、同じターゲットを 2 回ビルドすることを拒否します。というわけで、 target を呼び出してごまかそうとしていKillServerHosts2
ます。問題は、機能する場合と機能しない場合があることです。
コマンドラインからターゲットを実行するKillServerHosts
と、関連するサーバーホストが常に強制終了されるため、この点から問題なく動作します。
何か案は?