msbuild.exe reste ouvert, verrouillage des fichiers

98

J'utilise TeamCity qui à son tour appelle msbuild (.NET 4). J'ai un problème étrange en ce qu'une fois la construction terminée (et peu importe si c'était une construction réussie ou non), msbuild.exe reste ouvert et verrouille l'un des fichiers, ce qui signifie à chaque fois que TeamCity essaie pour effacer son répertoire de travail, il échoue et ne peut pas continuer.

Cela arrive presque à chaque fois.

Je suis vraiment perdu sur celui-ci, alors je vais essayer de fournir le plus de détails possible.

  • Le serveur est un Intel Core i7, 2 Go de RAM, avec Windows Server 2008 standard 64 bits SP2.
  • Dans TeamCity, le runner msbuild est configuré avec le /mparamètre de ligne de commande (ce qui signifie utiliser plusieurs cœurs)
  • Le fichier en question est TOUJOURS la même DLL externe qui est référencée dans l'un des projets .NET, dans le chemin External Tools\Telerik\Telerik.Reporting.Dll. (Il existe plusieurs autres fichiers .DLL inclus dans le répertoire External Toolsdans une structure de chemin similaire qui ne causent jamais ce problème). Actuellement, c'est avec la version d'essai des rapports Telerik, au cas où cela ferait une différence.
  • Lorsque le problème se produit, il y a toujours plusieurs msbuild.exe *32processus répertoriés dans le Gestionnaire de tâches: Je crois qu'il y en a 7. En utilisant Process Explorer, ils ressemblent tous à des processus de niveau supérieur (pas de parents). Ils utilisent tous de 20 à 50 Mo de RAM et 0,0% de CPU.
  • Si j'attends 1 à 3 minutes, les processus msbuild.exe se terminent d'eux-mêmes et TeamCity peut alors mettre à jour correctement le répertoire de travail.
  • Si je termine manuellement les processus msbuild, la mise à jour de TeamCity fonctionnera à nouveau immédiatement.
  • Les services d'indexation sont désactivés dans Windows (bien que les deux points précédents confirment à peu près que c'est msbuild.exe qui est à l'origine du problème).
  • Il n'y a pas de propriétés spéciales sur Telerik.reporting.dll. La seule propriété SVN estsvn:mime-type = application/octet-stream

Quelqu'un a-t-il déjà rencontré cela?

Gregmac
la source

Réponses:

123

Utilisez msbuildavec /nr:false.

En bref: MSBuild essaie de faire beaucoup de choses pour être rapide, en particulier avec les constructions parallèles. Cela engendrera beaucoup de «nœuds» - des processus msbuild.exe individuels qui peuvent compiler des projets, et comme les processus prennent un peu de temps à tourner, une fois la construction terminée, ces processus traînent (par défaut, pendant 15 minutes, je pense ), de sorte que si vous construisez à nouveau bientôt, ces nœuds peuvent être "réutilisés" et économiser le coût de configuration du processus. Mais vous pouvez désactiver ce comportement en désactivant nodeReuse avec l'option de ligne de commande susmentionnée.

Voir également:

Brian
la source
2
Cela a du sens: cela ne semble pas arriver si je supprime / m. J'essaye maintenant avec /m /nr:false, je vais courir pour quelques builds et voir comment ça se passe. Merci
gregmac
26
Comment obtenir Visual Studio pour générer le projet avec cette option msbuild?
Cameron Taggart
1
Je voudrais toujours savoir, mais j'ai en fait rencontré un bogue Visual Studio 11 Beta pour les projets C ++ / CLI. Cela
Cameron Taggart
3
L'optimisation prématurée est vraiment la racine de tout mal. Vous êtes nul, Microsoft.
johnwbyrd
1
@CameronTaggart Vous pouvez ajouter des options de ligne de commande msbuild avec un fichier spécial hébergé dans votre dossier projet / solution. Voir docs.microsoft.com/en-us/visualstudio/msbuild/…
needfulthing
43

Pour désactiver la réutilisation des nœuds dans Visual Studio, vous devez utiliser une variable d'environnement:

MSBUILDDISABLENODEREUSE=1
dan
la source
J'ai utilisé cela efficacement, mais il y a un autre outil qui échoue maintenant, lors de la compilation de C ++ avec VS11 Beta, c'est mt.exe, y a-t-il une autre variable à utiliser pour cela?
Eugenio Miró
Ne peut-il pas être défini à l'aide d'une boîte de dialogue quelque part dans VS?
dom_beau
1
@dan Merci sincèrement d'avoir trouvé celui-ci, et je prie pour qu'il y ait une variable d'environnement pour désactiver également Microsoft.VisualStudio.Web.Host.exe.
jerhewet
Cela fonctionne également lors de l'exécution d'une construction à partir de la ligne de commande, par exemple un script batch, un serveur de construction, etc.
Dave E