我有一个 MSBuild 项目文件,它生成一些自己的目标,然后导入它们。它工作得很好,除了msbuild
必须运行两次才能进行构建——一次生成规则,再次让它们可见以完成构建。(逻辑是从一个Makefile
本身只需要一次运行的。)
是否可以运行生成目标,然后运行 生成的目标之一?Import
以下清单是实际用例的简化版本,它表现出相同的行为。(除此之外,实际案例从模式的文件名列表生成目标*-to-*.xsl
,使用名称自动确定依赖关系和目标。)
目标是msbuild /t:SecondTarget
在第一次尝试时完成工作,而不是要求第二次。
<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>