web-dev-qa-db-fra.com

msbuild.exe reste ouvert, verrouille les fichiers

J'utilise TeamCity qui à son tour invoque msbuild (.NET 4). J'ai un problème étrange en ce qu'une fois la génération terminée (et cela ne semble pas avoir d'importance si la construction a réussi ou non), msbuild.exe reste ouvert et verrouille l'un des fichiers, ce qui signifie que chaque fois que TeamCity essaie pour effacer son répertoire de travail, il échoue et ne peut pas continuer.

Cela se produit presque à chaque fois.

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

  • Le serveur est un processeur Intel Core i7, 2 Go de RAM, avec Windows Server 2008 standard 64 bits SP2.
  • Dans TeamCity, le runner msbuild est configuré avec le /m paramètre de ligne de commande (ce qui signifie utiliser plusieurs cœurs)
  • Le fichier en question est TOUJOURS le même externe DLL qui est référencé dans l'un des projets .NET, dans le chemin External Tools\Telerik\Telerik.Reporting.Dll. (Il existe plusieurs autres fichiers .DLL inclus dans le External Tools dir dans une structure de chemin similaire qui ne cause 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 *32 processus répertoriés dans le Gestionnaire des 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 ensuite mettre à jour le répertoire de travail correctement.
  • Si j'arrête 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é spéciale sur Telerik.reporting.dll. La seule propriété SVN est svn:mime-type = application/octet-stream

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

89
gregmac

Utilisez msbuild avec /nr:false.

En bref: MSBuild essaie de faire beaucoup de choses pour être rapide, en particulier avec les builds parallèles. Il générera 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 s'il vous arrive de reconstruire 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:

116
Brian

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

MSBUILDDISABLENODEREUSE=1
39
dan