1+ #I @" src/packages/FAKE/tools"
2+ #r " FakeLib.dll"
3+ #r " System.Xml.Linq"
4+
5+ open System
6+ open System.IO
7+ open System.Text
8+ open Fake
9+ open Fake.FileUtils
10+ open Fake.TaskRunnerHelper
11+ open Fake.ProcessHelper
12+
13+ cd __ SOURCE_ DIRECTORY__
14+
15+ //--------------------------------------------------------------------------------
16+ // Information about the project for Nuget and Assembly info files
17+ //--------------------------------------------------------------------------------
18+
19+
20+ let product = " Akka.NET"
21+ let authors = [ " Akka.NET Team" ]
22+ let copyright = " Copyright © 2013-2016 Akka.NET Team"
23+ let company = " Akka.NET Team"
24+ let description = " Akka.NET is a port of the popular Java/Scala framework Akka to .NET"
25+ let tags = [ " akka" ; " actors" ; " actor" ; " model" ; " Akka" ; " concurrency" ]
26+ let configuration = " Release"
27+ let toolDir = " tools"
28+ let CloudCopyDir = toolDir @@ " CloudCopy"
29+ let AzCopyDir = toolDir @@ " AzCopy"
30+
31+ // Read release notes and version
32+
33+ let parsedRelease =
34+ File.ReadLines " RELEASE_NOTES.md"
35+ |> ReleaseNotesHelper.parseReleaseNotes
36+
37+ let envBuildNumber = System.Environment.GetEnvironmentVariable( " BUILD_NUMBER" )
38+ let buildNumber = if String.IsNullOrWhiteSpace( envBuildNumber) then " 0" else envBuildNumber
39+
40+ let version = parsedRelease.AssemblyVersion + " ." + buildNumber
41+ let preReleaseVersion = version + " -beta"
42+
43+ let isUnstableDocs = hasBuildParam " unstable"
44+ let isPreRelease = hasBuildParam " nugetprerelease"
45+ let release = if isPreRelease then ReleaseNotesHelper.ReleaseNotes.New( version, version + " -beta" , parsedRelease.Notes) else parsedRelease
46+
47+ printfn " Assembly version: %s \n Nuget version; %s \n " release.AssemblyVersion release.NugetVersion
48+ //--------------------------------------------------------------------------------
49+ // Directories
50+
51+ let binDir = " bin"
52+ let perfOutput = FullName " PerfResults"
53+
54+ let nugetDir = binDir @@ " nuget"
55+ let workingDir = binDir @@ " build"
56+ let libDir = workingDir @@ @" lib\net45\"
57+ let nugetExe = FullName @" src\.nuget\NuGet.exe"
58+ let docDir = " bin" @@ " doc"
59+
60+ open Fake.RestorePackageHelper
61+ Target " RestorePackages" ( fun _ ->
62+ " ./src/Akka.Logger.Serilog.sln"
63+ |> RestoreMSSolutionPackages ( fun p ->
64+ { p with
65+ OutputPath = " ./src/packages"
66+ Retries = 4 })
67+ )
68+
69+ //--------------------------------------------------------------------------------
70+ // Clean build results
71+
72+ Target " Clean" <| fun _ ->
73+ DeleteDir binDir
74+
75+ //--------------------------------------------------------------------------------
76+ // Generate AssemblyInfo files with the version for release notes
77+
78+ open AssemblyInfoFile
79+
80+ Target " AssemblyInfo" <| fun _ ->
81+ CreateCSharpAssemblyInfoWithConfig " src/SharedAssemblyInfo.cs" [
82+ Attribute.Company company
83+ Attribute.Copyright copyright
84+ Attribute.Trademark " "
85+ Attribute.Version version
86+ Attribute.FileVersion version ] <| AssemblyInfoFileConfig( false )
87+
88+
89+ //--------------------------------------------------------------------------------
90+ // Build the solution
91+
92+ Target " Build" <| fun _ ->
93+
94+ !! " src/Akka.Logger.Serilog.sln"
95+ |> MSBuildRelease " " " Rebuild"
96+ |> ignore
97+
98+ //--------------------------------------------------------------------------------
99+ // Copy the build output to bin directory
100+ //--------------------------------------------------------------------------------
101+
102+ Target " CopyOutput" <| fun _ ->
103+
104+ let copyOutput project =
105+ let src = " src" @@ project @@ @" bin/Release/"
106+ let dst = binDir @@ project
107+ CopyDir dst src allFiles
108+ [ " Akka.Logger.Serilog" ]
109+ |> List.iter copyOutput
110+
111+ Target " BuildRelease" DoNothing
112+
113+ //--------------------------------------------------------------------------------
114+ // Nuget targets
115+ //--------------------------------------------------------------------------------
116+
117+ //--------------------------------------------------------------------------------
118+ // Clean nuget directory
119+
120+ Target " CleanNuget" <| fun _ ->
121+ CleanDir nugetDir
122+
123+ //--------------------------------------------------------------------------------
124+ // Pack nuget for all projects
125+ // Publish to nuget.org if nugetkey is specified
126+
127+ let createNugetPackages _ =
128+ let removeDir dir =
129+ let del _ =
130+ DeleteDir dir
131+ not ( directoryExists dir)
132+ runWithRetries del 3 |> ignore
133+
134+ ensureDirectory nugetDir
135+ for nuspec in !! " src/**/*.nuspec" do
136+ printfn " Creating nuget packages for %s " nuspec
137+
138+ CleanDir workingDir
139+
140+ let project = Path.GetFileNameWithoutExtension nuspec
141+ let projectDir = Path.GetDirectoryName nuspec
142+ let projectFile = (!! ( projectDir @@ project + " .*sproj" )) |> Seq.head
143+ let releaseDir = projectDir @@ @" bin\Release"
144+ let packages = projectDir @@ " packages.config"
145+ let packageDependencies = if ( fileExists packages) then ( getDependencies packages) else []
146+
147+ let pack outputDir symbolPackage =
148+ NuGetHelper.NuGet
149+ ( fun p ->
150+ { p with
151+ Description = description
152+ Authors = authors
153+ Copyright = copyright
154+ Project = project
155+ Properties = [ " Configuration" , " Release" ]
156+ ReleaseNotes = release.Notes |> String.concat " \n "
157+ Version = release.NugetVersion
158+ Tags = tags |> String.concat " "
159+ OutputPath = outputDir
160+ WorkingDir = workingDir
161+ SymbolPackage = symbolPackage
162+ Dependencies = packageDependencies })
163+ nuspec
164+
165+ // Copy dll, pdb and xml to libdir = workingDir/lib/net45/
166+ ensureDirectory libDir
167+ !! ( releaseDir @@ project + " .dll" )
168+ ++ ( releaseDir @@ project + " .pdb" )
169+ ++ ( releaseDir @@ project + " .xml" )
170+ ++ ( releaseDir @@ project + " .ExternalAnnotations.xml" )
171+ |> CopyFiles libDir
172+
173+ // Copy all src-files (.cs and .fs files) to workingDir/src
174+ let nugetSrcDir = workingDir @@ @" src/"
175+ // CreateDir nugetSrcDir
176+
177+ let isCs = hasExt " .cs"
178+ let isFs = hasExt " .fs"
179+ let isAssemblyInfo f = ( filename f) .Contains( " AssemblyInfo" )
180+ let isSrc f = ( isCs f || isFs f) && not ( isAssemblyInfo f)
181+ CopyDir nugetSrcDir projectDir isSrc
182+
183+ //Remove workingDir/src/obj and workingDir/src/bin
184+ removeDir ( nugetSrcDir @@ " obj" )
185+ removeDir ( nugetSrcDir @@ " bin" )
186+
187+ // Create both normal nuget package and symbols nuget package.
188+ // Uses the files we copied to workingDir and outputs to nugetdir
189+ pack nugetDir NugetSymbolPackage.Nuspec
190+
191+ removeDir workingDir
192+
193+ let publishNugetPackages _ =
194+ let rec publishPackage url accessKey trialsLeft packageFile =
195+ let tracing = enableProcessTracing
196+ enableProcessTracing <- false
197+ let args p =
198+ match p with
199+ | ( pack, key, " " ) -> sprintf " push \" %s \" %s " pack key
200+ | ( pack, key, url) -> sprintf " push \" %s \" %s -source %s " pack key url
201+
202+ tracefn " Pushing %s Attempts left: %d " ( FullName packageFile) trialsLeft
203+ try
204+ let result = ExecProcess ( fun info ->
205+ info.FileName <- nugetExe
206+ info.WorkingDirectory <- ( Path.GetDirectoryName ( FullName packageFile))
207+ info.Arguments <- args ( packageFile, accessKey, url)) ( System.TimeSpan.FromMinutes 1.0 )
208+ enableProcessTracing <- tracing
209+ if result <> 0 then failwithf " Error during NuGet symbol push. %s %s " nugetExe ( args ( packageFile, " key omitted" , url))
210+ with exn ->
211+ if ( trialsLeft > 0 ) then ( publishPackage url accessKey ( trialsLeft-1 ) packageFile)
212+ else raise exn
213+ let shouldPushNugetPackages = hasBuildParam " nugetkey"
214+ let shouldPushSymbolsPackages = ( hasBuildParam " symbolspublishurl" ) && ( hasBuildParam " symbolskey" )
215+
216+ if ( shouldPushNugetPackages || shouldPushSymbolsPackages) then
217+ printfn " Pushing nuget packages"
218+ if shouldPushNugetPackages then
219+ let normalPackages =
220+ !! ( nugetDir @@ " *.nupkg" )
221+ -- ( nugetDir @@ " *.symbols.nupkg" ) |> Seq.sortBy( fun x -> x.ToLower())
222+ for package in normalPackages do
223+ try
224+ publishPackage ( getBuildParamOrDefault " nugetpublishurl" " " ) ( getBuildParam " nugetkey" ) 3 package
225+ with exn ->
226+ printfn " %s " exn.Message
227+
228+ if shouldPushSymbolsPackages then
229+ let symbolPackages = !! ( nugetDir @@ " *.symbols.nupkg" ) |> Seq.sortBy( fun x -> x.ToLower())
230+ for package in symbolPackages do
231+ try
232+ publishPackage ( getBuildParam " symbolspublishurl" ) ( getBuildParam " symbolskey" ) 3 package
233+ with exn ->
234+ printfn " %s " exn.Message
235+
236+
237+ Target " Nuget" <| fun _ ->
238+ createNugetPackages()
239+ publishNugetPackages()
240+
241+ Target " CreateNuget" <| fun _ ->
242+ createNugetPackages()
243+
244+ Target " PublishNuget" <| fun _ ->
245+ publishNugetPackages()
246+
247+
248+
249+ //--------------------------------------------------------------------------------
250+ // Help
251+ //--------------------------------------------------------------------------------
252+
253+ Target " Help" <| fun _ ->
254+ List.iter printfn [
255+ " usage:"
256+ " build [target]"
257+ " "
258+ " Targets for building:"
259+ " * Build Builds"
260+ " * Nuget Create and optionally publish nugets packages"
261+ " * All Builds, run tests, creates and optionally publish nuget packages"
262+ " "
263+ " Other Targets"
264+ " * Help Display this help"
265+ " * HelpNuget Display help about creating and pushing nuget packages"
266+ " " ]
267+
268+ Target " HelpNuget" <| fun _ ->
269+ List.iter printfn [
270+ " usage: "
271+ " build Nuget [nugetkey=<key> [nugetpublishurl=<url>]] "
272+ " [symbolskey=<key> symbolspublishurl=<url>] "
273+ " [nugetprerelease=<prefix>]"
274+ " "
275+ " Arguments for Nuget target:"
276+ " nugetprerelease=<prefix> Creates a pre-release package."
277+ " The version will be version-prefix<date>"
278+ " Example: nugetprerelease=dev =>"
279+ " 0.6.3-dev1408191917"
280+ " "
281+ " In order to publish a nuget package, keys must be specified."
282+ " If a key is not specified the nuget packages will only be created on disk"
283+ " After a build you can find them in bin/nuget"
284+ " "
285+ " For pushing nuget packages to nuget.org and symbols to symbolsource.org"
286+ " you need to specify nugetkey=<key>"
287+ " build Nuget nugetKey=<key for nuget.org>"
288+ " "
289+ " For pushing the ordinary nuget packages to another place than nuget.org specify the url"
290+ " nugetkey=<key> nugetpublishurl=<url> "
291+ " "
292+ " For pushing symbols packages specify:"
293+ " symbolskey=<key> symbolspublishurl=<url> "
294+ " "
295+ " Examples:"
296+ " build Nuget Build nuget packages to the bin/nuget folder"
297+ " "
298+ " build Nuget nugetprerelease=dev Build pre-release nuget packages"
299+ " "
300+ " build Nuget nugetkey=123 Build and publish to nuget.org and symbolsource.org"
301+ " "
302+ " build Nuget nugetprerelease=dev nugetkey=123 nugetpublishurl=http://abc"
303+ " symbolskey=456 symbolspublishurl=http://xyz"
304+ " Build and publish pre-release nuget packages to http://abc"
305+ " and symbols packages to http://xyz"
306+ " " ]
307+
308+ //--------------------------------------------------------------------------------
309+ // Target dependencies
310+ //--------------------------------------------------------------------------------
311+
312+ // build dependencies
313+ " Clean" ==> " AssemblyInfo" ==> " RestorePackages" ==> " Build" ==> " CopyOutput" ==> " BuildRelease"
314+
315+ // nuget dependencies
316+ " CleanNuget" ==> " CreateNuget"
317+ " CleanNuget" ==> " BuildRelease" ==> " Nuget"
318+
319+ Target " All" DoNothing
320+ " BuildRelease" ==> " All"
321+ " Nuget" ==> " All"
322+
323+ RunTargetOrDefault " Help"
0 commit comments