11

次の 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と、関連するサーバーホストが常に強制終了されるため、この点から問題なく動作します。

何か案は?

4

1 に答える 1

24

設計上、MSBuild ターゲットは複数回実行されません。MSBuild は関数型プログラミング言語ではないため、MSBuild ターゲットをメソッドまたは関数と考えるべきではありません。

ターゲットを複数回実行したい場合は、MSBuild タスクを使用して実行できます。別のプロパティ セットを渡すだけです。たとえば、このようなもの

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

注: 私は実際にこれを試していないので、スペルを間違えたり、間違って覚えていたりすると、構文の問題が発生する可能性がありますが、動作させることができるはずです。

于 2009-08-28T06:48:10.603 に答える