0

我有一个 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>
4

1 回答 1

1

我不认为这是可能的。根据设计,在调用任务时它没有项目的整个上下文。它只是传递给它的东西。它是这样设计的(至少有一个原因),因此任务调用不会产生难以识别的不可预见的后果。

于 2012-11-29T04:50:26.973 回答