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?
risposta
Il più vicino che trovato finora è definire FALSO come strumento esterno tramite
Tools -> External tools...
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.
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"
Molto interessante. Qual è l'effetto se questa opzione 'RealBuild'? – VillasV
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 ... –
Evento post-build? http://stackoverflow.com/a/1491413/126014 –
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