2010-10-12 10 views
76

J'utilise TeamCity qui à son tour appelle msbuild (.NET 4). J'ai un problème étrange en ce que, après une construction est terminée (et cela ne semble pas important 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. Ceci se produit presque à chaque fois.msbuild.exe reste ouvert, en verrouillant les fichiers

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

  • Le serveur est un disque dur Intel Core i7 de 2 Go avec Windows Server 2008 standard SP2 64 bits.
  • Dans TeamCity, le coureur de msbuild est configuré avec le paramètre de ligne de commande /m (ce qui signifie que d'utiliser plusieurs noyaux)
  • Le fichier en question est TOUJOURS la même DLL externe qui est référencé dans un des .NET projets, dans le chemin External Tools\Telerik\Telerik.Reporting.Dll. (Il existe plusieurs autres fichiers .DLL inclus dans le répertoire External Tools dans une structure de chemin similaire qui ne provoque jamais ce problème). Actuellement, il s'agit de la version d'essai des rapports Telerik, au cas où cela ferait une différence.
  • Lorsque le problème se produit, il existe toujours plusieurs processus msbuild.exe *32 répertoriés dans le Gestionnaire des tâches: Je crois qu'il existe 7. À l'aide de 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% CPU.
  • Si j'attends 1-3 minutes, les processus msbuild.exe se terminent d'eux-mêmes et TeamCity peut alors mettre à jour le répertoire de travail correctement.
  • 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 à l'origine du problème).
  • Il n'y a aucune propriété particulière sur Telerik.reporting.dll. La seule propriété SVN est svn:mime-type = application/octet-stream

Est-ce que quelqu'un a couru à travers cela avant?

Répondre

104

Utilisez msbuild avec /nr:false.

En résumé: MSBuild essaie de faire beaucoup de choses pour être rapide, en particulier avec les versions parallèles. Il générera beaucoup de "nœuds" - processus individuels msbuild.exe qui peuvent compiler des projets, et puisque 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 reconstruisez rapidement, 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 aussi:

+2

est logique: il ne semble pas se produire si je retire/m. J'essaie maintenant avec '/ m/nr: false', je vais lancer quelques builds et voir comment ça se passe. Merci – gregmac

+0

Été quelques jours, et des dizaines de constructions plus tard, et il ne s'est pas encore produit - semble être résolu. Merci – gregmac

+1

Super! Heureux de vous aider. – Brian

35

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

MSBUILDDISABLENODEREUSE=1 
+0

J'ai utilisé cela efficacement, mais il existe un autre outil qui échoue maintenant, lors de la compilation C++ avec VS11 bêta, c'est mt.exe, y at-il une autre variable à utiliser pour cette? –

+0

Ne peut-il pas être défini à l'aide d'une boîte de dialogue quelque part dans VS? –

+1

@dan Merci sincèrement d'avoir trouvé celui-ci, et je prie * il y a aussi une variable d'environnement pour désactiver Microsoft.VisualStudio.Web.Host.exe. – jerhewet