我們最近從MSBuild 2005升級到2008年。從那時起,MSBuild在構建解決方案時停止第一個錯誤。 2005年情況並非如此。 有沒有辦法獲得舊的行爲?當構建解決方案時,MSBuild 2008在第一個錯誤時停止
編輯:我們呼籲的MSBuild以命令行形式:
MSBuild.exe xyz.sln /p:Platform=Win32 /p:Configuration=Debug
我們最近從MSBuild 2005升級到2008年。從那時起,MSBuild在構建解決方案時停止第一個錯誤。 2005年情況並非如此。 有沒有辦法獲得舊的行爲?當構建解決方案時,MSBuild 2008在第一個錯誤時停止
編輯:我們呼籲的MSBuild以命令行形式:
MSBuild.exe xyz.sln /p:Platform=Win32 /p:Configuration=Debug
<MSBuild Projects="@(Solution)" ContinueOnError="false" StopOnFirstFailure="true"></MSBuild>
你必須要改變這種對劇本
我有一種解決方案這是一個小但它的工作原理如下:
當用解決方案文件調用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 "%(SkipLevel0.Identity)" is not selected for building in solution configuration "$(Configuration)|$(Platform)"." Condition="@(SkipLevel0) != ''" />
<Warning Text="The project configuration for project "%(MissingConfigLevel0.Identity)" was not specified in the solution file for the solution configuration "$(Configuration)|$(Platform)"." 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 "%(SkipLevel1.Identity)" is not selected for building in solution configuration "$(Configuration)|$(Platform)"." Condition="@(SkipLevel1) != ''" />
<Warning Text="The project configuration for project "%(MissingConfigLevel1.Identity)" was not specified in the solution file for the solution configuration "$(Configuration)|$(Platform)"." 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 "%(SkipLevel2.Identity)" is not selected for building in solution configuration "$(Configuration)|$(Platform)"." Condition="@(SkipLevel2) != ''" />
<Warning Text="The project configuration for project "%(MissingConfigLevel2.Identity)" was not specified in the solution file for the solution configuration "$(Configuration)|$(Platform)"." 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 "%(SkipLevel3.Identity)" is not selected for building in solution configuration "$(Configuration)|$(Platform)"." Condition="@(SkipLevel3) != ''" />
<Warning Text="The project configuration for project "%(MissingConfigLevel3.Identity)" was not specified in the solution file for the solution configuration "$(Configuration)|$(Platform)"." 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 "%(SkipLevel4.Identity)" is not selected for building in solution configuration "$(Configuration)|$(Platform)"." Condition="@(SkipLevel4) != ''" />
<Warning Text="The project configuration for project "%(MissingConfigLevel4.Identity)" was not specified in the solution file for the solution configuration "$(Configuration)|$(Platform)"." 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。
這工作得很好,但因爲它不是很容易的,我會永遠記住這作爲一個回答我的問題:-)
這沒有幫助,因爲我只是想建立一個解決方案,並儘量避免的MSBuild停止在解決方案的一個項目中發生第一個錯誤時進行構建。如果我有幾種解決方案,你的建議是很好的。 – mmmmmmmm 2009-01-23 17:15:38