0

msbuildファイルで問題が発生しています。

ビルドに3つのターゲットを設定し、次の順序で実行したいと思います。

  • Cleanup:前のビルドの出力をクリーンアップします
  • Build:実際のビルド
  • CopyFiles:より簡単な展開のためにビルドの出力をパッケージ化するタスク

ここで問題は次のとおりです。ターゲットのプロパティ(ReleasePath)をCopyFiles呼び出し元が明示的に設定する必要があります。Cleanupまた、Buildタスクを呼び出すだけの場合、呼び出し元は出力パスを設定する必要はありません。

私の最初の試みは次のとおりです。

<PropertyGroup>
  <ReleasePath></ReleasePath>
</PropertyGroup>

<Target Name="Initialize">
  <Error Text="The ReleasePath property isn't defined" Condition="'$(ReleasePath)' == ''"/>
</Target>

<Target Name="CopyFiles" DependsOnTargets="Initialize">
</Target>

正常に動作しますが、Initializeターゲットはの直前CopyFiles、つまり。の後に実行されBuildます。また、Buildターゲットの実行にはかなりの時間がかかる可能性があるため、何か問題が発生した場合は、すぐにユーザーに通知してもらいたいと思います。

それで、基本的にInitialize、最初にターゲットを実行する方法はありますが、ターゲットに含まれている場合に限りCopyFilesますか?

Initializeまた、プロジェクトのInitialTargets属性を入力し、選択されている場合にのみこのターゲットを実行する条件を設定することも考えましCopyFilesたが、驚いたことに、呼び出し元が選択したターゲットのリストを含むプロパティが見つかりませんでした。

4

1 に答える 1

0

目標を達成する最も簡単な方法は、渡されたターゲットのリストではなく、プロパティを使用して CopyFiles を切り替えることだと思います。常に CopyFiles を AfterBuild ターゲットに追加し、「ShouldCopyFiles」などのプロパティで条件を付ける場合は、次のこともできます。 Build の DependsOnTargets を条件付けします。

 <PropertyGroup>
  <ShouldCopyFiles Condition="'$(ShouldCopyFiles)'==''">false</ShouldCopyFiles>
  <ReleasePath></ReleasePath>
 </PropertyGroup>

 <PropertyGroup>
   <BuildDependsOn>
     BeforeBuild;
     CoreBuild;
     AfterBuild;
     CopyFiles;
   </BuildDependsOn>

 </PropertyGroup>

 <PropertyGroup Condition="'$(ShouldCopyFiles)'=='true'">
    <BeforeBuildDependsOn>
     Initialize;
   </BeforeBuildDependsOn>
 </PropertyGroup>

 <Target Name="Initialize" Condition="'$(ShouldCopyFiles)'=='true'">CheckStuff
 </Target>

 <Target Name="Build" DependsOnTargets="$(BuildDependsOn)"/>

 <Target Name="CoreBuild">YourBuildStuff</Target>
 <Target Name="BeforeBuild" DependsOnTargets="$(BeforeBuildDependsOn)"/>
 <Target Name="AfterBuild" />

 <Target Name="CopyFiles" Condition="'$(ShouldCopyFiles)'=='true'">
   CopyStuff 
 </Target>

この時点で、次のように MSBuild を呼び出すことができます。

 msbuild my.proj /targets:Clean;Build /p:ShouldCopyFiles=true 

そしてそれはそれをオンにします。

于 2013-02-06T04:43:15.873 に答える