2015-05-29 8 views
6

Ho un progetto che ha il seguente PostBuildEvent:Come utilizzare un PostBuildEvent localizzato in un ambiente con più collaboratori?

<PostBuildEvent> 
if exist Diagnostic.nuspec 
if exist "$(SolutionDir)\packages\NuGet.CommandLine.2.8.2\tools\NuGet.exe" 
"$(SolutionDir)\packages\NuGet.CommandLine.2.8.2\tools\NuGet.exe" 
pack Diagnostic.nuspec 
-OutputDirectory "C:\Users\jeroen\Google Drive\NugetLocal\VSDiagnostics" 
</PostBuildEvent> 

Qui, il OutPutDirectory è ovviamente locale per la mia installazione. Il valore predefinito è ..

Questa configurazione è memorizzata nel file .csproj del progetto che tiene anche traccia di cose come riferimenti ad altri assiemi e ai file nel progetto.

Per questo motivo non posso semplicemente ignorare il file in git o nessuna delle mie altre modifiche a .csproj passare attraverso.

C'è un modo per mantenere il mio localizzato PostBuildEvent senza imporlo ad altri collaboratori?

+2

Possibile problema XY? Perché vuoi questo output in una directory esterna? Hai pensato di farlo solo per la build di 'Release'? – RubberDuck

+1

Ho un feed NuGet locale puntato su quella directory perché ho anche altri progetti che puntano a quel feed locale. Se lascerei tutto nella directory predefinita del progetto, ciò significherebbe che avrei bisogno di un feed locale diverso per ogni progetto. Non sono sicuro di come farlo solo per build di rilascio lo risolverebbe comunque. –

+1

I tuoi collaboratori non dovrebbero avere bisogno di creare una versione. Sei il manutentore, quindi sei tu a fare le build di rilascio. – RubberDuck

risposta

3

Ho risolto il problema impostando una variabile di ambiente a livello di account utente e, in base a questo, utilizzarla o utilizzare l'impostazione predefinita.

semplicemente scambiato dell'originale PostBuildEvent e circondante PropertyGroup con questo:

<Choose> 
    <When Condition=" $(NUGETLOCAL) != '' "> 
     <PropertyGroup> 
      <PostBuildEvent>if exist Diagnostic.nuspec if exist "$(SolutionDir)\packages\NuGet.CommandLine.2.8.2\tools\NuGet.exe" "$(SolutionDir)\packages\NuGet.CommandLine.2.8.2\tools\NuGet.exe" pack Diagnostic.nuspec -OutputDirectory $(NUGETLOCAL)</PostBuildEvent> 
      <RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent> 
     </PropertyGroup> 
    </When> 
    <Otherwise> 
     <PropertyGroup> 
      <PostBuildEvent>if exist Diagnostic.nuspec if exist "$(SolutionDir)\packages\NuGet.CommandLine.2.8.2\tools\NuGet.exe" "$(SolutionDir)\packages\NuGet.CommandLine.2.8.2\tools\NuGet.exe" pack Diagnostic.nuspec -OutputDirectory .</PostBuildEvent> 
      <RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent> 
     </PropertyGroup> 
    </Otherwise> 
</Choose> 

La variabile di ambiente è impostata come NUGETLOCAL con valore "C:\Users\jeroen\Google Drive\NugetLocal\VSDiagnostics" (compresi gli accenti). Se la variabile non è impostata, utilizzerà la directory predefinita e l'utente ha la possibilità di definire la propria in qualsiasi momento.

Il codice probabilmente non è bello come può essere quindi fatemi sapere se vedete un miglioramento.

Ho elaborato questo here.

+0

Sì, è così. –

2

Come ho menzionato nei commenti, penso che questo dovrebbe essere fatto solo per le build Release. L'azione può essere saltata interamente a meno che non sia stata creata nella configurazione Release sfruttando la macro ConfigurationName.

if $(ConfigurationName) == Release (
    if exist Diagnostic.nuspec 
    if exist "$(SolutionDir)\packages\NuGet.CommandLine.2.8.2\tools\NuGet.exe" 
    "$(SolutionDir)\packages\NuGet.CommandLine.2.8.2\tools\NuGet.exe" 
    pack Diagnostic.nuspec 
    -OutputDirectory "C:\Users\jeroen\Google Drive\NugetLocal\VSDiagnostics" 
) 

Ecco il numero the list of all the available Macros. Capisco anche che sia all Environment variables are imported as macros, quindi potresti essere in grado di trovare qualcosa di un po 'più elegante in base al profilo utente e all'esistenza della sottodirectory.


Su ulteriore riflessione, è possibile utilizzare una variabile di ambiente standard, USERPROFILE e basta controllare per vedere se esiste il percorso.

if exist "$(USERPROFILE)\Google Drive\NugetLocal\VSDiagnostics"(
     if exist Diagnostic.nuspec 
     if exist "$(SolutionDir)\packages\NuGet.CommandLine.2.8.2\tools\NuGet.exe" 
     "$(SolutionDir)\packages\NuGet.CommandLine.2.8.2\tools\NuGet.exe" 
     pack Diagnostic.nuspec 
     -OutputDirectory "$(USERPROFILE)\Google Drive\NugetLocal\VSDiagnostics" 
    ) 

Questo tuttavia ha alcune limitazioni. Funzionerà solo su Windows. Linux uses a different variable for the user profile path.

+0

Lo userò come ultima risorsa perché imporrebbe comunque una restrizione ad altri collaboratori. Ma è ancora una buona soluzione. –

+0

Aggiornato la mia risposta per contenere un'altra possibile soluzione. (Naturalmente, estrai una variabile per la stringa duplicata) – RubberDuck

Problemi correlati