0

独自のターゲットのいくつかを生成し、それらをインポートする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>
4

1 に答える 1

1

これは不可能だと思います。タスクを呼び出すときの設計上、プロジェクトのコンテキスト全体が含まれているわけではありません。渡されたものだけがあります。このように設計されているため(少なくとも1つの理由)、タスクの呼び出しによって、特定が難しい予期しない結果が生じることはありません。

于 2012-11-29T04:50:26.973 に答える