specificare il file di progetto di una soluzione utilizzando msbuild


116

Voglio la riga di comando per costruire un particolare progetto di una soluzione usando msbuild come facciamo con devenv.com. In devenv.com possiamo specificare un progetto di una soluzione usando la seguente riga di comando

devenv.com /Build Release|x86 test.sln /project "testproject"

Utilizzando la riga di comando sopra posso costruire il testproject in test.sln usando devenv.com. Qual è la riga di comando per msbuild per la stessa soluzione.

Grazie


C'è qualche motivo per cui non stai solo passando il testproject stesso a msbuild?
Mark Smith

2
Dato che non posso più modificare il mio commento. Quello che voglio dire è fare riferimento direttamente al progetto invece che alla soluzione. "msbuild testproject / p: Configuration = Release / p: Platform = x86"
Mark Smith

tempo diverso ho per costruire progetti diversi. utilizzando devenv.com è facile specificando il progetto di quella soluzione
tjdoubts

Se questo è l'unico problema che hai, dovresti essere in grado di utilizzare msbuild per creare i progetti necessari al momento giusto. Hai già diversi comandi che esegui in momenti diversi sulla soluzione, quindi perché non fare riferimento ai progetti al momento giusto con diversi comandi di msbuild? Se i tuoi progetti sono impostati correttamente, dovrebbero capire tutti i loro riferimenti senza usare il file sln.
Mark Smith

Risposte:


202
msbuild test.sln /t:project /p:Configuration="Release" /p:Platform="x86" /p:BuildProjectReferences=false

Si noti che ciò a cui è assegnato /tè il nome del progetto nella soluzione, può essere diverso dal nome del file del progetto.

Inoltre, come indicato in Procedura: creare obiettivi specifici nelle soluzioni utilizzando MSBuild.exe :

Se il nome del progetto contiene uno dei caratteri %, $, @, ;, ., (, ), o ', sostituirli con un _in nome di destinazione specificata.

Puoi anche creare più progetti contemporaneamente:

msbuild test.sln /t:project;project2 /p:Configuration="Release" /p:Platform="x86" /p:BuildProjectReferences=false

Per ricostruire o pulire, passare /t:projecta /t:project:cleano/t:project:rebuild


99
Una nota importante: se il tuo progetto ha un '.' nel nome, dovrai sostituirlo con un '_' quando lo specifichi con / t
Watusimoto

4
@easton Per la creazione di più progetti, la sintassi era che il mio msbuild ripetesse il /tparametro per ogni progetto da costruire:msbuild test.sln /t:project /t:project2
Philippe

46
Inoltre, se si utilizza una cartella della soluzione, è necessario anteporre al nome del progetto il nome della cartella e una barra. Come @Watusimoto menzionato sopra, se hai punti (.) Nel nome, devi sostituirli con trattini bassi (_). Ho finito con qualcosa di simile a questo: /t:SlnFolder\My_Project_name.
Travis Parks

28
@TravisParks: potrebbe anche valere la pena ricordare che "cartella della soluzione" non si riferisce a una cartella del file system ma piuttosto a una cartella nella vista Esplora soluzioni.
joshbodily

4
Ho anche dovuto sostituire "(" e ")" con "_" nel nome della cartella (progetti generati da GYP). Immagino che tutti i caratteri speciali siano sostituiti con un trattino basso.
Maxime Viargues

15

MSBuild funziona effettivamente attraverso l'uso di progetti non la soluzione. La soluzione viene utilizzata solo per analizzarlo internamente in un file di progetto temporaneo in MSBuild. Dovresti essere in grado di creare il progetto di interesse direttamente tramite MSBuild eseguendo il comando seguente.

"msbuild testproject /p:Configuration=Release /p:Platform=x86"

C'è un grosso problema che so che potresti incontrare usando il progetto direttamente invece della soluzione: se usi la soluzione per esprimere le dipendenze tra i progetti, invece di aggiungere i riferimenti al progetto e lasciare che il sistema di compilazione elabori automaticamente le dipendenze .

Se stai applicando un ordine di compilazione usando il file sln, ti consiglio di lavorare queste dipendenze direttamente nei file proj e rimuoverle da sln. Ciò ti consentirà di richiamare direttamente qualsiasi file proj da MSBuild e tutti i progetti verranno compilati in modo indipendente senza alcun lavoro aggiuntivo. Dovresti davvero trattare il file sln come un gruppo di progetti per rendere più semplice il lavoro in Visual Studio e non come un input di compilazione.


4
Si prega di indicare come può essere applicato l'ordine di compilazione dai file proj. Grazie.
ProgramCpp

4
Ecco un altro problema con l'utilizzo diretto del nome del progetto. Ad esempio, hai 5 progetti nella tua soluzione. Alcuni progetti hanno la configurazione DebugPro e altri non l'hanno. Se costruisci un progetto con la configurazione che tutti i progetti hanno tutto è file ma solo il file della soluzione sai quale configurazione del progetto usare per ogni progetto se hai selezionato la configurazione della soluzione DebugPro.
Alex

@ProgramCpp Quando si aggiungono riferimenti da un progetto a un altro, viene automaticamente rilevato che il progetto a cui si fa riferimento deve essere creato per primo.
jpaugh

Un altro svantaggio di questo approccio è che i percorsi relativi nel progetto vengono risolti rispetto al file della soluzione. Una volta creato il progetto direttamente, il percorso relativo cambierà. L'output potrebbe essere altrove e gli unit test potrebbero cercare directory sbagliate.
Tomas Kubes

Possono verificarsi problemi anche se si utilizzano variabili di soluzione nella configurazione del progetto, come $ (SolutionDir)
Alex Che

8

Pubblicazione come informazione per futuri ricercatori

Aggiungi quanto segue allo script di build ed eseguilo una volta. Questo genererà gli obiettivi esatti e altre informazioni che msbuild utilizzerà effettivamente.

Es: se hai .nel nome del progetto o nelle cartelle, msbuild si aspetterà _al posto di ..

set MSBuildEmitSolution=1

Dopo aver ottenuto le informazioni, aggiorna lo script di build con i dettagli richiesti.


6
"Se hai". " nel nome del progetto o nelle cartelle msbuild si aspetterà '_' al posto di '.'. `
dhcgn

2

Per fare ciò, è necessario sapere qual è il nome di destinazione del progetto , non necessariamente il nome del progetto.

Un modo per scoprirlo è usare MSBuild contro il tuo SLN con i parametri previsti dopo aver impostato una variabile di ambiente speciale chiamata MSBuildEmitSolutional valore di 1.

set MSBuildEmitSolution=1
msbuild my_stuff.sln /t:rebuild /p:Configuration=Release /p:Platform=x64

Recentemente ho dovuto farlo a causa di un nome molto specifico per un obiettivo nelle directory annidate. Quindi dal mio file generato, my_stuff.sln.metaprojho trovato questa riga:

<Target Name="Utils\Firewall\FirewallUtils:Rebuild">

Ciò significa che la riga di comando da utilizzare finisce per essere,

msbuild my_stuff.sln /t:Utils\Firewall\FirewallUtils:Rebuild /p:Configuration=Release /p:Platform=x64

2
Questo era ciò di cui avevo bisogno. Suggerimento se non vuoi eseguirlo: il tuo obiettivo è la struttura delle cartelle dal percorso corrente al tuo file di progetto, meno l'estensione del file di progetto ( .csprojnel mio caso). Io <3 COSÌ!
Nessun rimborso Nessun ritorno

1

Solo per aggiungere ulteriori informazioni, l'esecuzione di msbuild nella cartella del progetto creerà per impostazione predefinita il file di progetto poiché è l'unico lì.

>msbuild

Esistono molte varianti dell'utilizzo di msbuild in questo modo. È possibile specificare direttamente il file proj.

>msbuild helloworld.csproj -t:Build.

Esamina la documentazione di msbuild per l'utilizzo, i requisiti del file proj e i vantaggi della creazione del progetto anziché della soluzione.

Documentazione di MS MSBuild

Ci sono vantaggi nel costruire in questo modo, come menzionato da Mark-Smith sopra.

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.