2011-12-06 4 views
5

Ho riscontrato un problema con MSBuild Non riesco a superarlo da solo. Di conseguenza, mi baso sulla saggezza della comunità.In che modo MSBuild crea una destinazione personalizzata specificata in csproj building sln?

La situazione reale che sto avendo problemi con

Ho un file soluiton contenente diversi progetti con dipendenze da altri progetti in stessa soluzione. Vorrei aggiungere un target personalizzato a uno dei file csproj del progetto e crearlo dalla riga di comando. Mi consentirà di creare tutti i binari di output necessari per questo progetto per un'ulteriore elaborazione durante la creazione del target personalizzato. Ma la cosa principale è che non riesco a capire come farlo, googling non aiuta neanche.

Semplificazione

Per rendere più semplice cosa ho deciso di fare un nuovo progetto di console C#, aggiungere un semplice obiettivo personalizzato per il file del progetto e cercare di renderlo costruire. Ancora nessun successo! Ecco quello che ho fatto finora:

  1. Creato un app soluzione con un progetto di coreapp console di default. Questo mi gaves almeno due file:

    • app.sln
    • coreapp \ coreapp.csproj
  2. coreapp.csproj modificato con l'aggiunta di mio target personalizzato all'interno del tag Progetto

    <Target Name="SampleTarget"> 
        <Message Text="This is a SampleTarget" /> 
    </Target> 
    
  3. Eseguire sulla riga di comando il seguente comando

    %windir%\Microsoft.NET\framework\v3.5\msbuild.exe app.sln /t:coreapp:SampleTarget

    o anche

    %windir%\Microsoft.NET\framework\v3.5\msbuild.exe app.sln /t:coreapp.csproj:SampleTarget

Risultati

Nessuna fortuna, di fronte l'errore

MSB4057: The target "coreapp.csproj:SampleTarget" does not exist in the project.

Ho il sospetto che MSBuild pensa somehting fondamentalmente diverso da quello che voglio pensare ...

Oltre a questo, ho anche cercato di impostare sulla stessa riga di comando la variabile d'ambiente MSBuildEmitSolution = 1 per forzare msbuild scaricare una soluzione temporanea file creato durante l'elaborazione della soluzione. In questo file, in effetti, nessun obiettivo simile. Tuttavia suppongo che non sia il motivo perché ho chiesto a msbuild di creare coreapp.proj dove target SampleTarget risiede realmente.

La domanda è come creare SampleTarget in questo scenario semplificato utilizzando il file di soluzione poiché potenzialmente può contenere dipendenze per il progetto contenente questo target SampleTarget?

Sarei grato per qualsiasi tipo di aiuto o di firme per ulteriori indagini!

+0

fa questo aiuto? http://stackoverflow.com/questions/3397460/custom-common-target-to-build-a-solution –

risposta

0

Un'opzione consiste nel legare il SampleTarget agli obiettivi di Build standard sostituendo la proprietà DependsOn appropriata. In questo caso puoi dire a BeforeBuild che dipende da SampleTarget o fai lo stesso con AfterBuild. Ciò assicurerà che MSBuild elabori il tuo obiettivo prima del target standard indicato.

2

Invece di inserire un target personalizzato nel file di progetto, si potrebbe provare a creare un nuovo file standalone msbuild, che sarebbe:

  • costruire il file di soluzione (che costruisce progetti)
  • definisce il tuo obiettivo in più

Chiamarlo app-custom-Debug.msbuild, ad esempio.

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup> 
    <WorkingFolder>$(MSBuildProjectDirectory)</WorkingFolder> 
    <Configuration>Debug</Configuration> 
    <SolutionFile>app.sln</SolutionFile> 
    </PropertyGroup> 

    <Target Name="Build" DependsOnTargets="Compile" /> 

    <Target Name="Compile"> 
    <Message Text="=== COMPILING $(Configuration) configuration ===" /> 
    <MSBuild Projects="$(SolutionFile)" 
      Properties="Configuration=$(Configuration)" /> 
    </Target> 

    <Target Name="SampleTarget"> 
    <Message Text="This is a SampleTarget" /> 
    </Target> 

</Project> 

Poi si esegue:

msbuild.exe app-custom-Debug.msbuild /t:SampleTarget 
Problemi correlati