2010-02-19 13 views
10

Stiamo usando .NET 3.5 con VS2008. Ho una soluzione con circa 20 progetti in esso, e quel numero crescerà nel tempo man mano che l'applicazione cresce e aggiunge nuovi moduli. Oggi avevo bisogno di impostare una proprietà su ogni progetto. Ho dovuto modificare ogni file csproj di aggiungere il seguente:MSBuild - Imposta proprietà per soluzione

<Target Name="BeforeBuild"> 
    <CreateProperty Condition=" '$(SolutionDir)' != '' And '$(SolutionDir)' != '*Undefined*' " 
        Value="$(SolutionDir)Tools\MSBuild"> 
     <Output TaskParameter="Value" PropertyName="AlToolPath" /> 
    </CreateProperty> 
    </Target> 

Questo per consentire ai progetti di trovare il linker di montaggio (Al.exe) memorizzata nel mio repository sorgente in modo che la build è macchina agnostica (puoi controllare e costruire su qualsiasi macchina con .NET senza dover installare l'SDK). La soluzione è costruita sulla riga di comando usando MSBuild dagli sviluppatori, installa file batch, CCNet, ecc.

In ogni caso, ho cercato un modo migliore per farlo (ad esempio qualcosa come le proprietà del livello della soluzione) ma non è stato possibile trovarne uno. So che è possibile impostare il valore della proprietà nella riga di comando di MSBuild, ma questo non è adatto per me dal momento che tutte le righe di comando esistenti e future dovrebbero includerlo. Ho anche pensato di chiamare un obiettivo prima nel primo progetto costruito per utilizzare un'attività personalizzata per impostare una variabile di ambiente e un target successivo nell'ultimo progetto per rimuoverlo, ma ciò sembrava più pesante e fragile rispetto alla semplice modifica di tutti i file di progetto singolarmente .

Per favore fatemi sapere se avete fatto qualcosa del genere o conoscete un modo per impostare una proprietà una volta per soluzione che può essere utilizzata da più progetti (incluso .NET 4/VS2010 di cui non ho esperienza). Ricorda che stiamo usando MSBuild per creare il file sln, non i singoli progetti.

risposta

14

È possibile specificare questa proprietà e tutte le altre comuni in un singolo file e caricarla includendo nei file di progetto un'istruzione Import. Questo è ciò che facciamo nel nostro ambiente di sviluppo, che ha qualcosa come 220 progetti integrati e più file di progetto condivisi (ad es. "Ramo"). Funziona bene.

+2

Mi piace questa soluzione, ma significa comunque che i file di progetto devono essere modificati almeno una volta. – Mafuba

+1

@Mafuba L'ho automatizzato usando NuGet. –

+0

fyi utilizzando VS 2017 se un file di oggetti condivisi è chiamato 'Directory.Build.props' sarà automaticamente importato in tutti i progetti nella gerarchia di directory. –

1

Poiché i file di soluzione non sono file MSBuild, non sarà possibile eseguire tali operazioni. L'unica scelta è gestirla o utilizzare un file master di msbuild al posto di creare il file di soluzione. Un'opzione potrebbe essere quella di creare una configurazione speciale che viene utilizzata dal processo di compilazione. E per i file di soluzione è possibile specificare la configurazione utilizzata.

7

Ho implementato la soluzione suggerita da @ fatcat111 un certo numero di volte. Questa volta ho automatizzato questo processo utilizzando NuGet - Common.Props. Il pacchetto aggiungerà un file di oggetti comuni a livello di soluzione e installando il pacchetto in più progetti della stessa soluzione è possibile condividere le proprietà.

Il codice è GitHub.

Problemi correlati