独自のターゲットのいくつかを生成し、それらをインポートするMSBuildプロジェクトファイルがあります。ビルドを実行するために2回実行する必要があることを除いて、うまく機能msbuild
します。ルールを生成するために1回実行し、ビルドを完了するためにルールを表示するためにもう一度実行する必要があります。Makefile
(ロジックは、それ自体が1回の実行のみを必要とするから移植されました。)
生成ターゲットを Import
実行してから、生成されたターゲットの1つを実行することは可能ですか?
次のリストは、同じ動作を示す実際のユースケースの簡単なバージョンです。(ポイントのほかに、実際のケースでは、パターンのファイル名のリストからターゲットが生成され*-to-*.xsl
、名前を使用して依存関係と宛先が自動的に決定されます。)
目的はmsbuild /t:SecondTarget
、2回目を必要とせずに、最初の試行で作業を行うことです。
<Project
xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
InitialTargets="AdditionalTargets"
ToolsVersion="4.0">
<!--
A trivial target-generating task. Presume something more useful for
the actual case.
-->
<UsingTask
TaskName="GenerateAdditionalTargets"
TaskFactory="CodeTaskFactory"
AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
<ParameterGroup>
<Result ParameterType="System.String" Output="true"/>
</ParameterGroup>
<Task>
<Reference Include="System.Xml"/>
<Reference Include="System.Xml.Linq"/>
<Using Namespace="System"/>
<Using Namespace="System.Xml.Linq"/>
<Code Type="Fragment" Language="cs"><![CDATA[
var ns = XNamespace.Get("http://schemas.microsoft.com/developer/msbuild/2003");
var collected = new XElement(ns + "Project",
new XAttribute("ToolsVersion", "4.0"),
new XElement(ns + "Target",
new XAttribute("Name", "SecondTarget"),
new XElement(ns + "Message",
new XAttribute("Text", "1.21GW?!")
)
)
);
Result = collected.ToString(SaveOptions.DisableFormatting);
]]></Code>
</Task>
</UsingTask>
<PropertyGroup>
<AdditionalTargets>additional.targets</AdditionalTargets>
</PropertyGroup>
<Target Name="AdditionalTargets">
<GenerateAdditionalTargets>
<Output TaskParameter="Result" PropertyName="Targets"/>
</GenerateAdditionalTargets>
<WriteLinesToFile File="$(AdditionalTargets)" Lines="$(Targets)" Overwrite="true"/>
</Target>
<Import Project="$(AdditionalTargets)" Condition="Exists('$(AdditionalTargets)')"/>
</Project>