1

最近、MSBuild 2005から2008にアップグレードしました。それ以降、MSBuildは、ソリューションを構築するときに最初のエラーで停止します。2005年はそうではありませんでした。古い動作を取得する方法はありますか?

編集:コマンドラインからMSBuildを呼び出します:

MSBuild.exe xyz.sln /p:Platform=Win32 /p:Configuration=Debug
4

2 に答える 2

4
<MSBuild Projects="@(Solution)" ContinueOnError="false" StopOnFirstFailure="true"></MSBuild>

スクリプトでこれを変更する必要があります

于 2009-01-23T12:50:02.107 に答える
1

私は少し複雑な一種の解決策を持っていますが、それは機能します:

ソリューションファイルを使用してMSBuildを呼び出すと、そのソリューションからプロジェクトファイルが内部的に生成され、そのプロジェクトファイルがビルドされます。環境変数msbuildemitsolutionを1に設定すると、そのプロジェクトファイルがソリューションファイルと同じ名前のハードディスクに出力されますが、その後に.projが続きます。さらに、プロジェクトファイルを常に再生成できないようにする.cacheファイルを常に生成します。だから私が最初にすることは:

IF EXIST xyz.sln.proj DEL xyz.sln.proj
IF EXIST xyz.sln.cache DEL xyz.sln.cache
SET msbuildemitsolution=1
MSBuild.exe xyz-sln /t:_xxxxx_ /noconsolelogger

ターゲットxxxxが存在してはならない場所。次に、MSBuildはxyz.sln.projを生成し、ターゲットが見つからないために多くのエラーを出力します。私が欲しかったのはプロジェクトファイルだったので、エラーは無視します。実際、私はC#プログラム内で上記のことを行いますが、理解を容易にするために、ここではBAT構文を選択しました。

xyz.sln.projは、 "Build"、 "Clean"、 "Rebuild"、 "Publish"、 ""、 ":Clean"、 ":Rebuild"、 ":Publish"、""..の多くのターゲットで構成されています。私が興味を持っているのは、ターゲットの「ビルド」、「リビルド」、「クリーン」だけです。これらのターゲットは、csprojファイルのセットをビルドするいくつかのMSBuildタスクで構成されています。これらのセットはBuildLevelX(Xは数値)と呼ばれます。C ++プロジェクトの場合、Build / Rebuild / Cleanターゲットには、タスクを直接呼び出すCallTargetタスクが含まれています。私のファイルからの抜粋:

<Target Name="Build" Condition="'$(CurrentSolutionConfigurationContents)' != ''" Outputs="@(CollectedBuildOutput)">
  <MSBuild Condition="@(BuildLevel0) != ''" Projects="@(BuildLevel0)" Properties="Configuration=%(Configuration); Platform=%(Platform); BuildingSolutionFile=true; CurrentSolutionConfigurationContents=$(CurrentSolutionConfigurationContents); SolutionDir=$(SolutionDir); SolutionExt=$(SolutionExt); SolutionFileName=$(SolutionFileName); SolutionName=$(SolutionName); SolutionPath=$(SolutionPath)" ToolsVersion="$(ProjectToolsVersion)" BuildInParallel="true" UnloadProjectsOnCompletion="$(UnloadProjectsOnCompletion)" UseResultsCache="$(UseResultsCache)" ContinueOnError="true">
    <Output TaskParameter="TargetOutputs" ItemName="CollectedBuildOutput" />
  </MSBuild>
  <Message Text="The project &quot;%(SkipLevel0.Identity)&quot; is not selected for building in solution configuration &quot;$(Configuration)|$(Platform)&quot;." Condition="@(SkipLevel0) != ''" />
  <Warning Text="The project configuration for project &quot;%(MissingConfigLevel0.Identity)&quot; was not specified in the solution file for the solution configuration &quot;$(Configuration)|$(Platform)&quot;." Code="MSB4121" HelpKeyword="MSBuild.SolutionProjectConfigurationMissing" Condition="@(MissingConfigLevel0) != ''" />
  <MSBuild Condition="@(BuildLevel1) != ''" Projects="@(BuildLevel1)" Properties="Configuration=%(Configuration); Platform=%(Platform); BuildingSolutionFile=true; CurrentSolutionConfigurationContents=$(CurrentSolutionConfigurationContents); SolutionDir=$(SolutionDir); SolutionExt=$(SolutionExt); SolutionFileName=$(SolutionFileName); SolutionName=$(SolutionName); SolutionPath=$(SolutionPath)" ToolsVersion="$(ProjectToolsVersion)" BuildInParallel="true" UnloadProjectsOnCompletion="$(UnloadProjectsOnCompletion)" UseResultsCache="$(UseResultsCache)" ContinueOnError="true">
    <Output TaskParameter="TargetOutputs" ItemName="CollectedBuildOutput" />
  </MSBuild>
  <Message Text="The project &quot;%(SkipLevel1.Identity)&quot; is not selected for building in solution configuration &quot;$(Configuration)|$(Platform)&quot;." Condition="@(SkipLevel1) != ''" />
  <Warning Text="The project configuration for project &quot;%(MissingConfigLevel1.Identity)&quot; was not specified in the solution file for the solution configuration &quot;$(Configuration)|$(Platform)&quot;." Code="MSB4121" HelpKeyword="MSBuild.SolutionProjectConfigurationMissing" Condition="@(MissingConfigLevel1) != ''" />
  <CallTarget Targets="SomeLib" RunEachTargetSeparately="true" ContinueOnError="true" />
  <MSBuild Condition="@(BuildLevel2) != ''" Projects="@(BuildLevel2)" Properties="Configuration=%(Configuration); Platform=%(Platform); BuildingSolutionFile=true; CurrentSolutionConfigurationContents=$(CurrentSolutionConfigurationContents); SolutionDir=$(SolutionDir); SolutionExt=$(SolutionExt); SolutionFileName=$(SolutionFileName); SolutionName=$(SolutionName); SolutionPath=$(SolutionPath)" ToolsVersion="$(ProjectToolsVersion)" BuildInParallel="true" UnloadProjectsOnCompletion="$(UnloadProjectsOnCompletion)" UseResultsCache="$(UseResultsCache)" ContinueOnError="true">
    <Output TaskParameter="TargetOutputs" ItemName="CollectedBuildOutput" />
  </MSBuild>
  <Message Text="The project &quot;%(SkipLevel2.Identity)&quot; is not selected for building in solution configuration &quot;$(Configuration)|$(Platform)&quot;." Condition="@(SkipLevel2) != ''" />
  <Warning Text="The project configuration for project &quot;%(MissingConfigLevel2.Identity)&quot; was not specified in the solution file for the solution configuration &quot;$(Configuration)|$(Platform)&quot;." Code="MSB4121" HelpKeyword="MSBuild.SolutionProjectConfigurationMissing" Condition="@(MissingConfigLevel2) != ''" />
  <CallTarget Targets="SomeProgram" RunEachTargetSeparately="true" ContinueOnError="true" />
  <MSBuild Condition="@(BuildLevel3) != ''" Projects="@(BuildLevel3)" Properties="Configuration=%(Configuration); Platform=%(Platform); BuildingSolutionFile=true; CurrentSolutionConfigurationContents=$(CurrentSolutionConfigurationContents); SolutionDir=$(SolutionDir); SolutionExt=$(SolutionExt); SolutionFileName=$(SolutionFileName); SolutionName=$(SolutionName); SolutionPath=$(SolutionPath)" ToolsVersion="$(ProjectToolsVersion)" BuildInParallel="true" UnloadProjectsOnCompletion="$(UnloadProjectsOnCompletion)" UseResultsCache="$(UseResultsCache)" ContinueOnError="true">
    <Output TaskParameter="TargetOutputs" ItemName="CollectedBuildOutput" />
  </MSBuild>
  <Message Text="The project &quot;%(SkipLevel3.Identity)&quot; is not selected for building in solution configuration &quot;$(Configuration)|$(Platform)&quot;." Condition="@(SkipLevel3) != ''" />
  <Warning Text="The project configuration for project &quot;%(MissingConfigLevel3.Identity)&quot; was not specified in the solution file for the solution configuration &quot;$(Configuration)|$(Platform)&quot;." Code="MSB4121" HelpKeyword="MSBuild.SolutionProjectConfigurationMissing" Condition="@(MissingConfigLevel3) != ''" />
  <MSBuild Condition="@(BuildLevel4) != ''" Projects="@(BuildLevel4)" Properties="Configuration=%(Configuration); Platform=%(Platform); BuildingSolutionFile=true; CurrentSolutionConfigurationContents=$(CurrentSolutionConfigurationContents); SolutionDir=$(SolutionDir); SolutionExt=$(SolutionExt); SolutionFileName=$(SolutionFileName); SolutionName=$(SolutionName); SolutionPath=$(SolutionPath)" ToolsVersion="$(ProjectToolsVersion)" BuildInParallel="true" UnloadProjectsOnCompletion="$(UnloadProjectsOnCompletion)" UseResultsCache="$(UseResultsCache)" ContinueOnError="true">
    <Output TaskParameter="TargetOutputs" ItemName="CollectedBuildOutput" />
  </MSBuild>
  <Message Text="The project &quot;%(SkipLevel4.Identity)&quot; is not selected for building in solution configuration &quot;$(Configuration)|$(Platform)&quot;." Condition="@(SkipLevel4) != ''" />
  <Warning Text="The project configuration for project &quot;%(MissingConfigLevel4.Identity)&quot; was not specified in the solution file for the solution configuration &quot;$(Configuration)|$(Platform)&quot;." Code="MSB4121" HelpKeyword="MSBuild.SolutionProjectConfigurationMissing" Condition="@(MissingConfigLevel4) != ''" />
</Target>

projファイルをロードし、Build / Rebuild/CleanターゲットのすべてのMSBuildタスクとCallTargetタスクにContinueOnError="true"を追加します。

XmlDocument msBuildProject = new XmlDocument();
msBuildProject.Load(Tools.getFullPath(m_strBaseDir, strSolutionProjFile));
foreach (XmlNode nodeL0 in msBuildProject.ChildNodes)
{
  XmlElement elementL0 = nodeL0 as XmlElement;
  if ((elementL0 != null) && (String.CompareOrdinal(nodeL0.Name, "Project") == 0))
  {
    foreach (XmlNode nodeL1 in elementL0.ChildNodes)
    {
      XmlElement elementL1 = nodeL1 as XmlElement;
      if ((elementL1 != null) && (String.CompareOrdinal(nodeL1.Name, "Target") == 0))
      {
        if ((String.CompareOrdinal(elementL1.Attributes["Name"].Value, "Build") == 0) ||
            (String.CompareOrdinal(elementL1.Attributes["Name"].Value, "Rebuild") == 0) ||
            (String.CompareOrdinal(elementL1.Attributes["Name"].Value, "Clean") == 0) ||
            (String.CompareOrdinal(elementL1.Attributes["Name"].Value, "Publish") == 0))
        {
          foreach (XmlNode nodeL2 in elementL1.ChildNodes)
          {
            XmlElement elementL2 = nodeL2 as XmlElement;
            if ((elementL2 != null) &&
                ((String.CompareOrdinal(nodeL2.Name, "MSBuild") == 0) ||
                 (String.CompareOrdinal(nodeL2.Name, "CallTarget") == 0)))
            {
              elementL2.SetAttribute("ContinueOnError", "true");
            }
          }
        }
      }
    }
  }
}
msBuildProject.Save(Tools.getFullPath(m_strBaseDir, strSolutionProjFile));

その後、構成を使用してMSBuildを呼び出します。

これは問題なく動作しますが、簡単ではないため、これを私の質問への回答としてマークすることは決してありません:-)

于 2009-01-26T10:12:50.087 に答える