回答

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

你必须要改变这种对剧本

+0

这没有帮助,因为我只是想建立一个解决方案,并尽量避免的MSBuild停止在解决方案的一个项目中发生第一个错误时进行构建。如果我有几种解决方案,你的建议是很好的。 – mmmmmmmm 2009-01-23 17:15:38

1

我有一种解决方案这是一个小但它的工作原理如下:

当用解决方案文件调用MSBuild时,它会从该解决方案内部生成一个项目文件并构建该项目t文件。将环境变量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语法。 “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> 

我加载该凸出文件,并添加ContinueOnError =“true”将所有的MSBuild和CallTarget任务,在构建/重建/清除目标:

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。

这工作得很好,但因为它不是很容易的,我会永远记住这作为一个回答我的问题:-)

相关问题