2015-05-13 9 views
10

Sto cercando una soluzione che invochi il mio script di build FAKE quando eseguo una "Build Solution" (Ctrl + F6). Punti bonus per un modo per specificare un target diverso da quello predefinito.Come posso ottenere che Visual Studio utilizzi FAKE per creare la mia soluzione?

+0

Non ho una risposta diretta, ma ha Paket file 'paket.targets' (https://github.com/fsprojects/ Paket/blob/68969d970bf2d60fb4e280e4365b6f87b9a7e285/.paket/paket.targets) che esegue Paket quando viene creata una soluzione (in pratica, eseguendo l'eseguibile). Sono sicuro che potresti fare lo stesso per FAKE - ma scrivere che materiale MS Build XML sarà doloroso ... –

+0

Evento post-build? http://stackoverflow.com/a/1491413/126014 –

+1

Ho esaminato come Paket fa questo: usano BuildDependsOn ma questo non funzionerebbe per uno script FAKE. L'obiettivo "Build" di FAKE, che esegue un task MSBuild, attiva lo script FAKE in modo ricorsivo. Non ho ancora trovato un modo corretto per farlo funzionare bene. – GeorgS

risposta

6

Il più vicino che trovato finora è definire FALSO come strumento esterno tramite

Tools -> External tools... 

ExternalTool

impostarlo per utilizzare la finestra di output e per richiedere per argomenti. Poi, definire un tasto di scelta rapida tramite

Tools -> Options -> Environment -> Keyboard -> Tools.ExternalCommand6 

Quando si richiama che è possibile fornire un bersaglio o semplicemente premere invio per costruire il default.

6

Ho risolto questo problema in un altro modo. Richiede la modifica manuale dei file csproj e il trucco è nell'override condizionale degli obiettivi incorporati , Clean e Rebuild.

Per prima cosa ho creato file personalizzato fake.targets e salvato nella cartella Targets a livello di soluzione:

<?xml version="1.0" encoding="utf-8"?> 
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <Target Name="Build"> 
    <Exec Command="packages\FAKE\tools\FAKE.exe build.fsx Build proj=$(ProjectPath) conf=$(Configuration) plat=$(Platform)" WorkingDirectory="..\" /> 
    </Target> 

    <Target Name="Rebuild"> 
    <Exec Command="packages\FAKE\tools\FAKE.exe build.fsx Rebuild proj=$(ProjectPath) conf=$(Configuration) plat=$(Platform)" WorkingDirectory="..\" /> 
    </Target> 

    <Target Name="Clean"> 
    <Exec Command="packages\FAKE\tools\FAKE.exe build.fsx Clean proj=$(ProjectPath) conf=$(Configuration) plat=$(Platform)" WorkingDirectory="..\" /> 
    </Target> 
</Project> 

Avanti, nella parte inferiore della <Project /> sezione in ogni file *.csproj progetto ho aggiunto:

<PropertyGroup> 
    <FakeTargetsPath>..\Targets\fake.targets</FakeTargetsPath> 
</PropertyGroup> 
<Import Project="$(FakeTargetsPath)" Condition="Exists($(FakeTargetsPath)) And '$(RealBuild)'!='true'" /> 

Nota:FakeTargetsPath è relativo al file csproj.

Ultimo passo è stato quello di creare build.fsx che richiama MSBuild con RealBuild = true:

#r @"packages/FAKE/tools/FakeLib.dll" 
open Fake 

let solution = "solution.sln" 

let commonBuild target = 
    let project = getBuildParamOrDefault "proj" solution 
    let configuration = getBuildParamOrDefault "conf" "Release" 
    let platform = getBuildParamOrDefault "plat" "AnyCPU" 
    let setParams defaults = 
     { defaults with 
      Verbosity = Some(Quiet) 
      Targets = [ target ] 
      Properties = 
       [ 
        "Configuration", configuration 
        "Platform", platform 
        "RealBuild", "true" 
       ] 
     } 

    build setParams project 

Target "Build" (fun _ -> 
    commonBuild "Build" 
) 

Target "Clean" (fun _ -> 
    commonBuild "Clean" 
) 

Target "Rebuild" (fun _ -> 
    commonBuild "Rebuild" 
) 

RunTargetOrDefault "Build" 
+0

Molto interessante. Qual è l'effetto se questa opzione 'RealBuild'? – VillasV