2009-05-07 12 views
172

In una build di successo, desidero copiare il contenuto della directory di output in un'altra posizione sotto la stessa cartella "base". Questa cartella principale è una parte relativa e può variare in base alle impostazioni del controllo del codice sorgente.Evento di creazione post di Visual Studio - Copia nella posizione della directory relativa

ho elencato alcuni dei valori Macro a mia disposizione ...

$ (SolutionDir) = D: \ GlobalDir \ Version \ AppName \ Solution1 \ costruire

$ (ProjectDir) = D: \ GlobalDir \ Version \ AppName \ Solution1 \ Version \ ProjectA \

voglio copiare il contenuto di uscita Dir nella seguente cartella:

D: \ GlobalDir \ Version \ AppName \ Solution2 \ Project \ Dipendenza

La posizione di base "D: \ GlobalDir \ Version \ AppName" ha bisogno di essere prelevati da una delle macro di cui sopra. Tuttavia, nessuno dei valori della macro elenca solo posizione principale.

Come estrarre solo l'ubicazione di base per il comando di copia post-generazione?

risposta

154

Se nessuno dei TargetDir o di altre macro puntare al posto giusto, utilizzare la directory ".." per tornare indietro la gerarchia delle cartelle.

ie. Utilizzare $(SolutionDir)\..\.. per ottenere la directory di base.


Per l'elenco di tutte le macro, vedere qui:

http://msdn.microsoft.com/en-us/library/c02as0cs.aspx

+1

Anche questo è utile: http://msdn.microsoft.com/en-us/library/c02as0cs.aspx – Eric

36

Si potrebbe provare:

$(SolutionDir)\..\..\ 
+5

Si prega di tenere presente che la variabile $ (SolutionDir) ha già la barra posteriore. Fonte: "La directory della soluzione (definita con drive e path), include la barra retroversa" \ "." https://msdn.microsoft.com/en-us/library/42x5kfw4.aspx – Snicker

2

sarebbe alcun senso utilizzare MSBuild direttamente? Se lo fai con ogni build, puoi aggiungere un'attività di msbuild alla fine? Se vuoi solo vedere se non riesci a trovare un altro valore macro che non è mostrato nell'IDE di Visual Studio, puoi attivare le opzioni di msbuild in diagnostica e questo ti mostrerà tutte le variabili che potresti usare, come così come il loro valore attuale.

Per attivarlo in Visual Studio, vai su Strumenti/Opzioni quindi scorri verso il basso la vista ad albero nella sezione chiamata Progetti e soluzioni, espandi e fai clic su Crea ed esegui, a destra c'è un menu a discesa che specifica la verbosità di output build, impostando quella su diagnostica, ti mostrerà quali altri valori macro potresti usare.

Perché non so esattamente a quale livello ti piacerebbe andare e quanto complesso vuoi che sia la tua build, questo potrebbe darti un'idea. Recentemente ho fatto script di build, che eseguono anche codice SQL come parte della build. Se vuoi qualche aiuto in più o anche qualche script di build di esempio, fammi sapere, ma se è solo un piccolo processo che vuoi eseguire alla fine della build, forse lo script completo di msbuild è un po 'eccessivo .

Speranza che aiuta Rihan

+0

thx Rihan, ma apparentemente VS 2003 non sembra supportare questo! Sono ovviamente abbastanza contento dell'evento post build ;-) – Preets

+0

Non mi ero reso conto che fosse vs2003, e quindi l'uso di msbuild come possibile soluzione, se ricordo che il vs2003 era pre l'era di msbuild? Grazie per la risposta. Buona fortuna con VS 2003, non mi sono guardato indietro dopo aver passato a VS2005 –

205

Ecco ciò che si vuole mettere in riga di comando eventi post-generazione del progetto:

copy /Y "$(TargetDir)$(ProjectName).dll" "$(SolutionDir)lib\$(ProjectName).dll" 

EDIT: Oppure, se il nome di destinazione è diverso dal nome di progetto .

copy /Y "$(TargetDir)$(TargetName).dll" "$(SolutionDir)lib\$(TargetName).dll" 
+1

Buon consiglio. Ho dimenticato le virgolette. –

+2

Non ha funzionato per me perché ho dimenticato il '/ Y'. Grazie per aver mostrato l'intero comando. – Mark

+6

Si può usare 'xcopy' con i caratteri jolly e gli interruttori appropriati per ottenere un risultato simile, mantenendo la struttura (struttura) della cartella di origine, ad esempio:' xcopy/i/e/s/y/f " \ MyFolder \ * "" \ MyFolder "' – Dr1Ku

8

penso che questo è legato, ma ho avuto un problema quando si costruisce direttamente utilizzando msbuild riga di comando (da un file batch) vs edificio dall'interno VS.

Usando qualcosa di simile al seguente:

<PostBuildEvent> 
    MOVE /Y "$(TargetDir)something.file1" "$(ProjectDir)something.file1" 
    start XCOPY /Y /R "$(SolutionDir)SomeConsoleApp\bin\$(ConfigurationName)\*" "$(ProjectDir)App_Data\Consoles\SomeConsoleApp\" 
</PostBuildEvent> 

(nota: start XCOPY piuttosto che XCOPY usato per aggirare un problema di autorizzazioni che impediva la copia)

La macro $(SolutionDir) valutati per ..\ durante l'esecuzione msbuild da un file batch, che ha comportato il fallimento del comando XCOPY. In caso contrario, funzionava correttamente quando veniva creato da Visual Studio. Confermato usando /verbosity:diagnostic per vedere l'output valutato.

L'utilizzo della macro $(ProjectDir)..\ invece, che equivale alla stessa cosa, ha funzionato correttamente e ha mantenuto il percorso completo in entrambi gli scenari di costruzione.

+1

cross-linking allo stesso [ hack] (http://stackoverflow.com/a/20638116/1037948) nel caso in cui ho dimenticato di dare credito ... – drzaus

+0

Ben fatto, ha funzionato il meglio di tutte le risposte – AgentFire

+0

'Start' ha funzionato per me (per' xcopy' in una cartella condivisa). – AgentFire

Problemi correlati