build.fsx 8.4 KB
Newer Older
1 2 3 4 5 6 7
// --------------------------------------------------------------------------------------
// FAKE build script
// --------------------------------------------------------------------------------------

#I "packages/FAKE/tools"
#r "packages/FAKE/tools/FakeLib.dll"
open System
D
Don Syme 已提交
8
open System.IO
9
open Fake
D
Don Syme 已提交
10
open Fake.AppVeyor
11 12 13 14 15
open Fake.ReleaseNotesHelper

#if MONO
// prevent incorrect output encoding (e.g. https://github.com/fsharp/FAKE/issues/1196)
System.Console.OutputEncoding <- System.Text.Encoding.UTF8
16 17 18

CleanDir (__SOURCE_DIRECTORY__ + "/../tests/TestResults") 
File.WriteAllText(__SOURCE_DIRECTORY__ + "/../tests/TestResults/notestsyet.txt","No tests yet")
19 20
#endif

21 22 23 24 25 26 27 28 29 30 31
let dotnetExePath = DotNetCli.InstallDotNetSDK "2.0.2"

let runDotnet workingDir args =
    let result =
        ExecProcess (fun info ->
            info.FileName <- dotnetExePath
            info.WorkingDirectory <- workingDir
            info.Arguments <- args) TimeSpan.MaxValue

    if result <> 0 then failwithf "dotnet %s failed" args

32 33 34 35 36
// --------------------------------------------------------------------------------------
// Utilities
// --------------------------------------------------------------------------------------

let assertExitCodeZero x = if x = 0 then () else failwithf "Command failed with exit code %i" x
D
Don Syme 已提交
37 38 39 40 41
let runCmdIn workDir (exe:string) = Printf.ksprintf (fun (args:string) ->
#if MONO
        let exe = exe.Replace("\\","/")
        let args = args.Replace("\\","/")
        printfn "[%s] mono %s %s" workDir exe args
42
        Shell.Exec("mono", sprintf "%s %s" exe args, workDir)
D
Don Syme 已提交
43 44
#else
        printfn "[%s] %s %s" workDir exe args
45
        Shell.Exec(exe, args, workDir)
D
Don Syme 已提交
46
#endif
47 48 49 50 51 52 53
        |> assertExitCodeZero
)

// --------------------------------------------------------------------------------------
// The rest of the code is standard F# build script
// --------------------------------------------------------------------------------------

D
Don Syme 已提交
54
let releaseDir = Path.Combine(__SOURCE_DIRECTORY__, "../release")
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85


// Read release notes & version info from RELEASE_NOTES.md
let release = LoadReleaseNotes (__SOURCE_DIRECTORY__ + "/RELEASE_NOTES.md")
let isAppVeyorBuild = buildServer = BuildServer.AppVeyor
let isVersionTag tag = Version.TryParse tag |> fst
let hasRepoVersionTag = isAppVeyorBuild && AppVeyorEnvironment.RepoTag && isVersionTag AppVeyorEnvironment.RepoTagName
let assemblyVersion = if hasRepoVersionTag then AppVeyorEnvironment.RepoTagName else release.NugetVersion
let nugetVersion = release.NugetVersion
open SemVerHelper
let nugetDebugVersion =
    let semVer = SemVerHelper.parse nugetVersion
    let debugPatch, debugPreRelease =
        match semVer.PreRelease with
        | None -> semVer.Patch + 1, { Origin = "alpha001"; Name = "alpha"; Number = Some 1; Parts = [AlphaNumeric "alpha001"] }
        | Some pre ->
            let num = match pre.Number with Some i -> i + 1 | None -> 1
            let name = pre.Name
            let newOrigin = sprintf "%s%03d" name num
            semVer.Patch, { Origin = newOrigin; Name = name; Number = Some num; Parts = [AlphaNumeric newOrigin] }
    let debugVer =
        { semVer with
            Patch = debugPatch
            PreRelease = Some debugPreRelease }
    debugVer.ToString()
let buildDate = DateTime.UtcNow
let buildVersion =
    if hasRepoVersionTag then assemblyVersion
    else if isAppVeyorBuild then sprintf "%s-b%s" assemblyVersion AppVeyorEnvironment.BuildNumber
    else assemblyVersion

86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
Target "Clean" (fun _ ->
    CleanDir releaseDir
)

Target "Restore" (fun _ ->
    for p in (!! "./../**/packages.config") do
        let result =
            ExecProcess (fun info ->
                info.FileName <- FullName @"./../.nuget/NuGet.exe"
                info.WorkingDirectory <- FullName @"./.."
                info.Arguments <- sprintf "restore %s -PackagesDirectory \"%s\" -ConfigFile \"%s\""   (FullName p) (FullName "./../packages") (FullName "./../.nuget/NuGet.Config")) TimeSpan.MaxValue
        if result <> 0 then failwithf "nuget restore %s failed" p

    runDotnet __SOURCE_DIRECTORY__ "restore tools.fsproj"
)

102 103 104 105 106 107 108 109 110
Target "BuildVersion" (fun _ ->
    Shell.Exec("appveyor", sprintf "UpdateBuild -Version \"%s\"" buildVersion) |> ignore
)

// --------------------------------------------------------------------------------------
// Clean build results & restore NuGet packages


Target "Build.NetFx" (fun _ ->
D
Don Syme 已提交
111
    !! "FSharp.Compiler.Service.sln"
112 113 114 115 116 117 118 119 120
    |> MSBuild "" "Build" ["Configuration","Release" ]
    |> Log (".NETFxBuild-Output: ")
)


// --------------------------------------------------------------------------------------
// Run the unit tests using test runner

Target "Test.NetFx" (fun _ ->
121 122 123 124 125 126 127 128 129 130 131 132 133
    let testDir = __SOURCE_DIRECTORY__ + "/../tests/fcs"
    CleanDir testDir

    let outDir = releaseDir + "/fcs"

    !! (outDir + "/**/*.*")
    |> CopyFiles testDir

    let toolPath = __SOURCE_DIRECTORY__ + "/../packages/NUnit.Console.3.0.0/tools"
    !! (toolPath + "/*.*")
    |> CopyFiles testDir

    !! (testDir + "/**/FSharp.Compiler.Service.Tests.dll")
134 135
    |>  Fake.Testing.NUnit3.NUnit3 (fun p ->
        { p with
136
            ToolPath = testDir + "/nunit3-console.exe"
137
            ShadowCopy = false
138
            WorkingDir = FullName testDir
139 140 141 142 143 144
            TimeOut = TimeSpan.FromMinutes 20. })
)

// --------------------------------------------------------------------------------------
// Build a NuGet package
Target "NuGet.NetFx" (fun _ ->
D
Don Syme 已提交
145 146 147
    runCmdIn __SOURCE_DIRECTORY__  "../.nuget/NuGet.exe" @"pack nuget/FSharp.Compiler.Service.nuspec -OutputDirectory %s" releaseDir
    runCmdIn __SOURCE_DIRECTORY__  "../.nuget/NuGet.exe" @"pack nuget/FSharp.Compiler.Service.MSBuild.v12.nuspec -OutputDirectory %s" releaseDir
    runCmdIn __SOURCE_DIRECTORY__  "../.nuget/NuGet.exe" @"pack nuget/FSharp.Compiler.Service.ProjectCracker.nuspec -OutputDirectory %s" releaseDir
148 149 150 151 152 153 154 155 156
)



// --------------------------------------------------------------------------------------
// .NET Core and .NET Core SDK


Target "Build.NetStd" (fun _ ->
157
    runDotnet __SOURCE_DIRECTORY__ (sprintf "pack %s -v n -c Release" "FSharp.Compiler.Service.netstandard.sln")
158 159 160 161
)


Target "Test.NetStd" (fun _ ->
162
    runDotnet __SOURCE_DIRECTORY__ (sprintf "run -p FSharp.Compiler.Service.Tests.netcore/FSharp.Compiler.Service.Tests.netcore.fsproj -c Release -- --result:TestResults.NetStd.xml;format=nunit3")
163 164 165 166 167
)


//use dotnet-mergenupkg to merge the .NETstandard nuget package into the default one
Target "Nuget.AddNetStd" (fun _ ->
D
Don Syme 已提交
168 169
    let nupkg = sprintf "%s/FSharp.Compiler.Service.%s.nupkg" releaseDir release.AssemblyVersion
    let netcoreNupkg = sprintf "FSharp.Compiler.Service.netstandard/bin/Release/FSharp.Compiler.Service.%s.nupkg" release.AssemblyVersion
170
    runDotnet __SOURCE_DIRECTORY__ (sprintf "mergenupkg --source %s --other %s --framework netstandard1.6" nupkg netcoreNupkg)
171 172 173 174 175 176
)


// --------------------------------------------------------------------------------------
// Generate the documentation

D
Don Syme 已提交
177
Target "GenerateDocsEn" (fun _ ->
D
Don Syme 已提交
178
    executeFSIWithArgs "docsrc/tools" "generate.fsx" [] [] |> ignore
179 180 181
)

Target "GenerateDocsJa" (fun _ ->
D
Don Syme 已提交
182
    executeFSIWithArgs "docsrc/tools" "generate.ja.fsx" [] [] |> ignore
183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204
)

// --------------------------------------------------------------------------------------
// Release Scripts

Target "PublishNuGet" (fun _ ->
    Paket.Push (fun p ->
        let apikey =
            match getBuildParam "nuget-apikey" with
            | s when not (String.IsNullOrWhiteSpace s) -> s
            | _ -> getUserInput "Nuget API Key: "
        { p with
            ApiKey = apikey
            WorkingDir = releaseDir })
)

// --------------------------------------------------------------------------------------
// Run all targets by default. Invoke 'build <Target>' to override

Target "Release" DoNothing
Target "NuGet" DoNothing
Target "Build" DoNothing
D
Don Syme 已提交
205 206
Target "GenerateDocs" DoNothing
Target "TestAndNuGet" DoNothing
207 208 209

"Clean"
  =?> ("BuildVersion", isAppVeyorBuild)
210
  ==> "Restore"
211 212 213 214
  ==> "Build.NetStd"

"Clean"
  =?> ("BuildVersion", isAppVeyorBuild)
215
  ==> "Restore"
216 217 218 219 220 221 222 223 224
  ==> "Build.NetFx"

"Build.NetFx"
  ==> "Test.NetFx"

"Build.NetStd"
  ==> "Test.NetStd"

"Build.NetFx"
225
  ==> "Build.NetStd"
226 227 228
  ==> "Build"

"Build.NetStd"
229
  ==> "Nuget.AddNetStd"
230 231 232

"Build.NetFx"
  ==> "NuGet.NetFx"
233
  ==> "Nuget.AddNetStd"
234 235
  ==> "NuGet"

D
Don Syme 已提交
236 237 238 239 240
"Test.NetFx"
  ==> "TestAndNuGet"

"NuGet"
  ==> "TestAndNuGet"
241
  
D
Don Syme 已提交
242

243 244 245 246 247
"Build"
  ==> "NuGet"
  ==> "PublishNuGet"
  ==> "Release"

D
Don Syme 已提交
248 249
"Build"
  ==> "GenerateDocsEn"
250
  ==> "GenerateDocs"
D
Don Syme 已提交
251 252

"Build"
253
  ==> "GenerateDocsJa"
D
Don Syme 已提交
254 255 256
  ==> "GenerateDocs"

"GenerateDocs"
257 258 259
  ==> "Release"

RunTargetOrDefault "Build"