2014-11-11 15 views
9

Ho un problema con la mia soluzione ASP.NET Web-Api in cui il mio agente di compilazione non può pulire le sue directory di lavoro perché la libreria Microsoft.Bcl.Build.Tasks.dll è ancora in uso da qualche processo quindi non può essere cancellata. Le uniche cose che faccio nel mio agente di build sono di costruire la soluzione usando MSBuild.exe standard, quindi eseguo alcuni test di unità usando MSTest.exe.non è riuscito a rimuovere Microsoft.Bcl.Build.Tasks.dll

Ho notato che Microsoft.Bcl.Build versione 1.0.14 (la versione che sto usando) è elencata come dipendenza dallo Microsoft.Net.Http e anche da Microsoft.Bcl libraries.

mio flusso di lavoro nel agente è come questo:

  • clone un repo git all'agente
  • costruire la soluzione utilizzando msbuild
  • prova la soluzione con mstest
  • qualche tempo dopo, forse 10 minuti, provo a ripulire l'iterazione corrente
  • la pulizia dei file non riesce a causa dell'errore descritto

La mia domanda è questa:

Qualcuno sa perché questa libreria è in uso da qualche processo anche dopo molti minuti? Esiste un processo comune su Windows che utilizzerebbe questa libreria in background? Vorrei utilizzare il gestore dei processi per scoprire perché questo file era in uso, ma queste macchine di generazione sono considerate caselle di produzione e sono quasi impossibili da ottenere l'accesso come amministratore.

Grazie in anticipo per l'aiuto!

+1

Hai provato a colpirlo con Handle o LockHunter? Hai provato a passare '/ nr: false' a MSBuild? –

risposta

2

Se la soluzione contiene bersagli personalizzati di msbuild e quegli stessi target di msbuild sono utilizzati da un altro csproj nella stessa soluzione, si verificherà un conflitto in fase di compilazione. Effettivamente, staresti cercando di compilare una parte del processo di compilazione a metà della compilazione e ti imbatterai in questi tipi di errori di blocco dei file. La soluzione alternativa è dividere i progetti di destinazione personalizzati di msbuild in una soluzione separata e crearli quando necessario. Penso che avresti bisogno di scaricare & ricaricare il progetto che dipende dagli obiettivi di msbuild ogni volta che li ricostruisci. Una volta o due, avevo bisogno di riavviare VS.

Se non sono state aggiunte attività personalizzate di msbuild, è possibile capire quale sia la causa del problema osservando i pacchetti NuGet installati. Fare clic con il tasto destro del mouse sulla soluzione e fare clic su "Gestisci pacchetti NuGet". Prova a rimuovere Microsoft.Bcl.Build dall'elenco dei pacchetti installati. Dovrebbe fallire perché qualcosa dipende da questo. Prendi nota di quale pacchetto dipende da questo. Se il primo suggerimento non ha aiutato, postback un commento con cui i pacchetti dipendono da esso e vedrò se posso scavare/ricordare dove altro ho visto questo prima.

Questa domanda ha più dettagli & i collegamenti con ciò che Microsoft.Bcl.Build è e ciò che è usato per se siete interessati: What does the Microsoft.Bcl.Build NuGet package do?

+0

La tua risposta sembra affrontare il problema se dovesse accadere in fase di compilazione ... tuttavia la mia soluzione non ha problemi in fase di compilazione. Solo qualche tempo dopo. Stai dicendo che la soluzione potrebbe essere compilata correttamente ma avrà ancora qualche problema di blocco target in seguito? – tezromania

+0

Ho visto personalmente che VS mantiene i blocchi di dll coinvolti nel processo di compilazione fino a quando il processo VS non si chiude (oltre la durata della build come ci si aspetterebbe), ma non me lo aspetterei da un build agent. Verifica se l'aggiunta di questa proprietà è utile: http://stackoverflow.com/a/22825192/179223 Se funziona, puoi aggiungere la proprietà in modo condizionale tramite l'argomento della riga di comando anziché manipolare il file csproj. – scottt732

4

prima eliminare eventuali usi da processi tramite un programma come LockHunter, quindi riavviare VS . Ha funzionato per me

+1

Hanno usato l'opzione Trova di Process Explorer per lo stesso scopo, ma LockHunter è molto più pratico. Grazie per segnalarlo. –

1

Ho appena incontrato lo stesso problema sul mio server gitlab build che fa un git fetch prima di ogni serie di build.

Dopo aver aggiunto Microsoft.Bcy.Async da NuGet al mio progetto, il passo dopo la compilazione non riuscita con warning: failed to remove packages/Microsoft.Bcl.Build.1.0.14/tools/Microsoft.Bcl.Build.Tasks.dll

Con LockHunter ho identificato diverse attività MSBuild.exe.

Con queste informazioni ho trovato la soluzione qui su così: https://stackoverflow.com/a/12193759/98491

Per farla breve: i processi di MSBuild vengono tenute aperte per migliorare le prestazioni durante la costruzione. Questo può essere disabilitato impostando la variabile di ambiente MSBUILDDISABLENODEREUSE = 1 o passando /nodeReuse:false allo stesso msbuild.

Questo lo ha risolto per me.

Problemi correlati