msbuild.exe rimane aperto, bloccando i file


98

Uso TeamCity che a sua volta richiama msbuild (.NET 4). Ho uno strano problema in quanto dopo che una build è completa (e non sembra importare se è stata una build riuscita o meno), msbuild.exe rimane aperto e blocca uno dei file, il che significa che ogni volta che TeamCity prova per cancellare la sua directory di lavoro, fallisce e non può continuare.

Succede quasi ogni volta.

Sono davvero perso su questo, quindi cercherò di fornire il maggior numero di dettagli possibile.

  • Il server è un Intel Core i7, 2 GB di ram, con Windows Server 2008 standard a 64 bit SP2.
  • In TeamCity, il runner msbuild è configurato con il /mparametro della riga di comando (che significa utilizzare più core)
  • Il file in questione è SEMPRE la stessa DLL esterna a cui si fa riferimento in uno dei progetti .NET, nel percorso External Tools\Telerik\Telerik.Reporting.Dll. (Ci sono molti altri file .DLL inclusi nella directory External Toolsin una struttura di percorso simile che non causano mai questo problema). Attualmente questo è con la versione di prova dei rapporti Telerik, nel caso in cui ciò faccia la differenza.
  • Quando si verifica il problema, ci sono sempre diversi msbuild.exe *32processi elencati in Task manager: credo che ce ne siano 7. Utilizzando Process Explorer, sembrano tutti processi di primo livello (nessun genitore). Usano tutti da 20-50 MB di RAM e 0,0% di CPU.
  • Se aspetto 1-3 minuti, i processi msbuild.exe si chiudono da soli e TeamCity può aggiornare correttamente la directory di lavoro.
  • Se interrompo manualmente i processi di msbuild, l'aggiornamento di TeamCity funzionerà di nuovo immediatamente.
  • I servizi di indicizzazione sono disattivati ​​in Windows (anche se i due punti precedenti confermano praticamente che è msbuild.exe a causare il problema).
  • Non esistono proprietà speciali su Telerik.reporting.dll. L'unica proprietà SVN èsvn:mime-type = application/octet-stream

Qualcuno l'ha incontrato prima?

Risposte:


123

Usa msbuildcon /nr:false.

In breve: MSBuild cerca di fare molte cose per essere veloce, soprattutto con build parallele. Genererà molti "nodi" - singoli processi msbuild.exe che possono compilare progetti, e poiché i processi impiegano un po 'di tempo per avviarsi, dopo che la compilazione è terminata, questi processi si bloccano (per impostazione predefinita, per 15 minuti, credo ), in modo che se ti capita di ricostruire presto, questi nodi possono essere "riutilizzati" e risparmiare il costo di configurazione del processo. Ma puoi disabilitare questo comportamento disattivando nodeReuse con la suddetta opzione della riga di comando.

Guarda anche:


2
Ha senso: non sembra accadere se rimuovo / m. Sto provando ora con /m /nr:false, correrò per alcune build e vedrò come va. Grazie
gregmac

26
Come si ottiene che Visual Studio compili il progetto con quell'opzione di msbuild?
Cameron Taggart

1
Vorrei ancora saperlo, ma in realtà mi sono imbattuto in un bug di Visual Studio 11 Beta per i progetti C ++ / CLI. Causa gli stessi sintomi: connect.microsoft.com/VisualStudio/feedback/details/728912/…
Cameron Taggart

3
L'ottimizzazione prematura è veramente la radice di tutti i mali. Fai schifo, Microsoft.
johnwbyrd

1
@CameronTaggart È possibile aggiungere opzioni della riga di comando di msbuild con un file speciale ospitato nella cartella del progetto / soluzione. Vedere docs.microsoft.com/en-us/visualstudio/msbuild/...
needfulthing

43

Per disabilitare il riutilizzo dei nodi in Visual Studio, è necessario utilizzare una variabile di ambiente:

MSBUILDDISABLENODEREUSE=1

L'ho usato in modo efficace, tuttavia c'è un altro strumento che non funziona ora, quando si compila C ++ con VS11 Beta, questo è mt.exe, c'è qualche altra variabile da usare per questo?
Eugenio Miró

Non può essere impostato utilizzando una finestra di dialogo da qualche parte in VS?
dom_beau

1
@dan Grazie sinceri per aver trovato questo, e prego che ci sia una variabile d'ambiente per disabilitare anche Microsoft.VisualStudio.Web.Host.exe.
jerhewet

Funziona anche quando si esegue una build dalla riga di comando, ad esempio uno script batch, un server di compilazione, ecc.
Dave E
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.