Répondre

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

Vous devez changer cela sur le script

+0

Ce ne serait pas utile parce que je veux seulement construire une solution et essayer d'éviter que MSBuild arrête de le construire sur l'occurrence de la première erreur dans l'un des projets de la solution. Votre suggestion est bonne si j'avais plusieurs solutions. – mmmmmmmm

1

J'ai une sorte de solution qui est un peu peu complexe mais cela fonctionne:

Lorsque vous appelez MSBuild avec un fichier de solution, il génère en interne un fichier de projet à partir de cette solution et comp t fichier. Lors de la définition de la variable d'environnement msbuildemitsolution à 1, le fichier de projet est généré sur le disque dur nommé comme le fichier de solution mais suivi avec .proj. En outre, il génère toujours un fichier .cache qui l'empêche de régénérer le fichier de projet tout le temps. Donc ce que je fais d'abord est:

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 

Où ne devrait pas exister la cible xxxx. MSBuild génère ensuite un fichier xyz.sln.proj et génère de nombreuses erreurs en raison de la cible manquante. J'ignore les erreurs car ce que je voulais, c'était le fichier de projet. En fait, je fais les choses ci-dessus dans un programme C# mais pour une meilleure compréhension j'ai choisi la syntaxe BAT ici. Le xyz.sln.proj se compose de plusieurs cibles: "Build", "Clean", "Rebuild" et "Publish" et "", ": Clean", ": Reconstruire", ": Publish", " "... Ce qui m'intéresse, ce sont les cibles" Build "," Rebuild "et" Clean ". Ces cibles se composent de plusieurs tâches MSBuild qui créent des ensembles de fichiers csproj. Ces ensembles sont appelés BuildLevelX (où X est un nombre). Pour les projets C++, les cibles Build/Rebuild/Clean contiennent des tâches CallTarget qui appellent directement les tâches. Un extrait de mon fichier:

<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> 

je charge le fichier proj et ajouter ContinueOnError = "true" à toutes les tâches MSBuild et CallTarget dans la construction/Reconstruire/Clean cible:

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)); 

Après cela J'appelle MSBuild avec la configuration.

Cela fonctionne bien, mais parce qu'il est pas très facile, je ne fera jamais marquer cela comme une réponse à ma question :-)

Questions connexes