回答

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。

這工作得很好,但因爲它不是很容易的,我會永遠記住這作爲一個回答我的問題:-)

相關問題