How do I add build automation to the project?
Fake is a DSL for build tasks that is modular, extensible and easy to start with. Fake allows you to easily build, bundle, deploy your app and more by executing a single command.
The standard template comes with a FAKE project by default, so this recipe only applies to the minimal template.
1. Create a build project
Create a new console app called 'Build' at the root of your solution
dotnet new console -lang f# -n Build -o .
We are creating the project directly at the root of the solution in order to allow us to execute the build without needing to navigate into a subfolder.
2. Create a build script
Open the project you just created in your IDE and rename the module it contains from
This renaming is't explicitly necessary, however it keeps your solution consistent with other SAFE apps and is a better name for the file really.
If you just rename the file directly rather than in your IDE, then the Build project won't be able to find it unless you edit the Build.fsproj file as well
Build.fs and paste in the following code.
open Fake.Core open Fake.IO open System let redirect createProcess = createProcess |> CreateProcess.redirectOutputIfNotRedirected |> CreateProcess.withOutputEvents Console.WriteLine Console.WriteLine let createProcess exe arg dir = CreateProcess.fromRawCommandLine exe arg |> CreateProcess.withWorkingDirectory dir |> CreateProcess.ensureExitCode let dotnet = createProcess "dotnet" let npm = let npmPath = match ProcessUtils.tryFindFileOnPath "npm" with | Some path -> path | None -> failwith "npm was not found in path." createProcess npmPath let run proc arg dir = proc arg dir |> Proc.run |> ignore let execContext = Context.FakeExecutionContext.Create false "build.fsx" [ ] Context.setExecutionContext (Context.RuntimeContext.Fake execContext) Target.create "Clean" (fun _ -> Shell.cleanDir (Path.getFullName "deploy")) Target.create "InstallClient" (fun _ -> run npm "install" ".") Target.create "Run" (fun _ -> run dotnet "build" (Path.getFullName "src/Shared") [ dotnet "watch run" (Path.getFullName "src/Server") dotnet "fable watch --run webpack-dev-server" (Path.getFullName "src/Client") ] |> Seq.toArray |> Array.map redirect |> Array.Parallel.map Proc.run |> ignore ) open Fake.Core.TargetOperators let dependencies = [ "Clean" ==> "InstallClient" ==> "Run" ] [<EntryPoint>] let main args = try match args with | [| target |] -> Target.runOrDefault target | _ -> Target.runOrDefault "Run" 0 with e -> printfn "%A" e 1
3. Add the project to the solution
Run the following command
dotnet sln add Build.fsproj
4. Installing dependencies
You will need to install the following dependencies:
We recommend migrating to Paket. It is possible to use FAKE without Paket, however this will not be covered in this recipe.
5. Run the app
At the root of the solution, run
dotnet paket install to install all your dependencies.
If you now execute
dotnet run, the default target will be run. This will build the app in development mode and launch it locally.
To learn more about targets and FAKE in general, see Getting Started with FAKE.