11// include Fake lib
22#r @" tools/FAKE/tools/FakeLib.dll"
3+ #load @" InheritDoc.fsx"
34open Fake
45open System
6+ open InheritDoc
7+ open SemVerHelper
8+ open AssemblyInfoFile
9+
510
611// Properties
712let buildDir = " build/output/"
@@ -14,11 +19,34 @@ Target "Clean" (fun _ ->
1419 CleanDir buildDir
1520)
1621
22+
23+
1724Target " BuildApp" ( fun _ ->
25+ let binDirs = !! " src/**/bin/**"
26+ |> Seq.map DirectoryName
27+ |> Seq.distinct
28+ |> Seq.filter ( fun f -> ( f.EndsWith( " Debug" ) || f.EndsWith( " Release" )) && not ( f.Contains " CodeGeneration" ))
29+
30+ CleanDirs binDirs
31+
32+ //Override the prebuild event because it just calls a fake task BuildApp depends on anyways
33+ let msbuildProperties = [
34+ ( " Configuration" , " Release" );
35+ ( " PreBuildEvent" , " ECHO" );
36+ ]
37+
1838 //Compile each csproj and output it seperately in build/output/PROJECTNAME
1939 !! " src/**/*.csproj"
2040 |> Seq.map( fun f -> ( f, buildDir + directoryInfo( f) .Name.Replace( " .csproj" , " " )))
21- |> Seq.iter( fun ( f , d ) -> MSBuildRelease d " Build" ( seq { yield f }) |> ignore)
41+ |> Seq.iter( fun ( f , d ) -> MSBuild d " Build" msbuildProperties ( seq { yield f }) |> ignore)
42+
43+ //Scan for xml docs and patch them to replace <inheritdoc /> with the documentation
44+ //from their interfaces
45+ !! " build/output/Nest/Nest.xml" |> Seq.iter( fun f -> PatchXmlDoc f)
46+
47+ CopyFile " build/output/Nest/init.ps1" " build/nest-init.ps1"
48+ CopyFile " build/output/Elasticsearch.Net/init.ps1" " build/elasticsearch-init.ps1"
49+
2250)
2351
2452Target " Test" ( fun _ ->
@@ -31,85 +59,130 @@ Target "Test" (fun _ ->
3159)
3260
3361let keyFile = " build/keys/keypair.snk"
34- let validateSignedAssembly = fun name ->
62+
63+ let createKeys = fun _ ->
3564 let sn = " build/tools/sn/sn.exe"
3665 ExecProcess( fun p ->
3766 p.FileName <- sn
38- p.Arguments <- sprintf @" -v build\output\%s.dll" name
39- ) ( TimeSpan.FromMinutes 5.0 )
40-
41- let signAssembly = fun name ->
42- let ilmerge = " build/tools/ilmerge/ILMerge.exe"
43- let platform = @" /targetplatform:v4,C:\Windows\Microsoft.NET\Framework64\v4.0.30319"
44- let i = sprintf " build\\ output\\ %s \\ %s " name name
45- let o = sprintf " build\\ output\\ %s " name
67+ p.Arguments <- sprintf @" -k %s" keyFile
68+ ) ( TimeSpan.FromMinutes 5.0 ) |> ignore
69+
70+ ExecProcess( fun p ->
71+ p.FileName <- sn
72+ p.Arguments <- sprintf @" -p %s %s" keyFile " build/keys/public.snk"
73+ ) ( TimeSpan.FromMinutes 5.0 ) |> ignore
74+
75+ Target " CreateKeysIfAbsent" ( fun _ ->
76+ if not ( fileExists keyFile) then createKeys()
77+ )
78+
79+ let validateSignedAssembly = fun name ->
80+ let sn = " build/tools/sn/sn.exe"
81+ let out = ( ExecProcessAndReturnMessages( fun p ->
82+ p.FileName <- sn
83+ p.Arguments <- sprintf @" -v build\output\%s\%s.dll" name name
84+ ) ( TimeSpan.FromMinutes 5.0 ))
4685
47- let dll = i + " .dll"
48- let outdll = o + " .dll"
49- let pdb = o + " .pdb"
50-
51- let signExitCode = (
52- ExecProcess( fun p ->
53- p.FileName <- ilmerge
54- p.Arguments <- ( sprintf " %s /keyfile:%s /out:%s %s "
55- dll keyFile outdll platform)
56- ) ( TimeSpan.FromMinutes 5.0 )
57- )
86+ let valid = ( out.ExitCode, out.Messages.FindIndex( fun s -> s.Contains( " is valid" )))
87+
88+ match valid with
89+ | ( 0 , i) when i >= 0 -> trace ( sprintf " %s was signed correctly" name)
90+ | (_, _) -> failwithf " {0} was not validly signed"
91+
92+ let out = ( ExecProcessAndReturnMessages( fun p ->
93+ p.FileName <- sn
94+ p.Arguments <- sprintf @" -T build\output\%s\%s.dll" name name
95+ ) ( TimeSpan.FromMinutes 5.0 ))
96+
97+ let tokenMessage = ( out.Messages.Find( fun s -> s.Contains( " Public key token is" )));
98+ let token = ( tokenMessage.Replace( " Public key token is" , " " )) .Trim();
5899
59- let validateExitCode = validateSignedAssembly name
60- match ( signExitCode, validateExitCode) with
61- | ( 0 , 0 ) ->
62- MoveFile ( DirectoryName dll) outdll
63- MoveFile ( DirectoryName dll) pdb
64- | _ ->
65- failwithf " Failed to sign {0}" name
100+ let valid = ( out.ExitCode, token)
101+ let oficialToken = " 96c599bbe3e70f5d"
102+ match valid with
103+ | ( 0 , t) when t = oficialToken ->
104+ trace ( sprintf " %s was signed with official key token %s " name t)
105+ | (_, t) -> traceFAKE " %s was not signed with the official token: %s but %s " name oficialToken t
66106
67107let nugetPack = fun name ->
68-
108+ let fileVersion = ( getBuildParamOrDefault " version " " 0.1.0 " )
69109 CreateDir nugetOutDir
70-
110+ let package = ( sprintf @" build\%s.nuspec" name)
111+ let packageContents = ReadFileAsString package
112+ let re = @" (?<start>\<version\>|"" (Elasticsearch.Net|Nest)"" version="" )[^"" ><]+(?<end>\<\/version\>|"" )"
113+ let replacedContents = regex_ replace re ( sprintf " ${start}%s ${end}" fileVersion) packageContents
114+ WriteStringToFile false package replacedContents
115+
71116 let dir = sprintf " %s /%s /" buildDir name
72- let version = " 1.0.0-c2"
73117 NuGetPack ( fun p ->
74118 { p with
75- Version = version
119+ Version = fileVersion
76120 WorkingDir = dir
77121 OutputPath = dir
78122 })
79- ( sprintf @" build\%s.nuspec " name )
123+ package
80124
81- MoveFile nugetOutDir ( buildDir + ( sprintf " %s /%s .%s .nupkg" name name version ))
125+ MoveFile nugetOutDir ( buildDir + ( sprintf " %s /%s .%s .nupkg" name name fileVersion ))
82126
83127let buildDocs = fun action ->
84128 let node = @" build\tools\Node.js\node.exe"
85129 let wintersmith = @" ..\build\tools\node_modules\wintersmith\bin\wintersmith"
86130 ExecProcess ( fun p ->
87- p.WorkingDirectory <- " new_docs"
88- p.FileName <- node
89- p.Arguments <- sprintf " \" %s \" %s " wintersmith action
90- ) ( TimeSpan.FromMinutes ( if action = " preview" then 300.0 else 5.0 ))
91-
131+ p.WorkingDirectory <- " new_docs"
132+ p.FileName <- node
133+ p.Arguments <- sprintf " \" %s \" %s " wintersmith action
134+ )
135+ ( TimeSpan.FromMinutes ( if action = " preview" then 300.0 else 5.0 ))
136+
92137Target " Version" ( fun _ ->
93- let v = ( getBuildParamOrDefault " version" " 0.1.0" )
94- let version = SemVerHelper.parse v
95- let assemblyVersion = sprintf " %i .%i .0.0" version.Major version.Minor
96-
97- trace ( sprintf " %s %s " v assemblyVersion)
98-
138+ let fileVersion = ( getBuildParamOrDefault " version" " 0.1.0" )
139+ let version = SemVerHelper.parse fileVersion
140+
141+ let suffix = fun ( prerelease : PreRelease ) -> sprintf " -%s%i " prerelease.Name prerelease.Number.Value
142+ let assemblySuffix = if version.PreRelease.IsSome then suffix version.PreRelease.Value else " " ;
143+ let assemblyVersion = sprintf " %i .0.0%s " version.Major assemblySuffix
144+
145+ match ( assemblySuffix, version.Minor, version.Patch) with
146+ | ( s, m, p) when s <> " " && ( m <> 0 || p <> 0 ) -> failwithf " Cannot create prereleases for minor or major builds!"
147+ | ( " " , _, _) -> traceFAKE " Building fileversion %s for asssembly version %s " fileVersion assemblyVersion
148+ | _ -> traceFAKE " Building prerelease %s for major assembly version %s " fileVersion assemblyVersion
149+
150+ let assemblyDescription = fun ( f : string ) ->
151+ let name = f
152+ match f.ToLowerInvariant() with
153+ | f when f = " elasticsearch.net" -> " Elasticsearch.Net - oficial low level elasticsearch client"
154+ | f when f = " nest" -> " NEST - oficial high level elasticsearch client"
155+ | f when f = " elasticsearch.net.connection.thrift" -> " Elasticsearc.Net.Connection.Thrift - Add thrift support to elasticsearch."
156+ | _ -> sprintf " %s " name
157+
158+ !! " src/**/AssemblyInfo.cs"
159+ |> Seq.iter( fun f ->
160+ let name = ( directoryInfo f) .Parent.Parent.Name
161+ CreateCSharpAssemblyInfo f [
162+ Attribute.Title name
163+ Attribute.Copyright ( sprintf " Elasticsearch %i " DateTime.UtcNow.Year)
164+ Attribute.Description ( assemblyDescription name)
165+ Attribute.Company " Elasticsearch"
166+ Attribute.Configuration " Release"
167+ Attribute.Version assemblyVersion
168+ Attribute.FileVersion fileVersion
169+ Attribute.InformationalVersion fileVersion
170+ ]
171+ )
99172)
100173
174+
101175Target " Release" ( fun _ ->
102176 if not <| fileExists keyFile
103177 then failwithf " {0} does not exist to sign the assemblies" keyFile
104178
105- //signAssembly("Elasticsearch.Net")
106- //signAssembly("Elasticsearch.Net.Connection.Thrift")
107- //signAssembly("Nest")
108-
109179 nugetPack( " Elasticsearch.Net" )
110180 nugetPack( " Elasticsearch.Net.Connection.Thrift" )
111181 nugetPack( " Nest" )
112182
183+ validateSignedAssembly( " Elasticsearch.Net" )
184+ validateSignedAssembly( " Elasticsearch.Net.Connection.Thrift" )
185+ validateSignedAssembly( " Nest" )
113186)
114187
115188Target " Docs" ( fun _ -> buildDocs " build" |> ignore)
@@ -120,14 +193,19 @@ Target "DocsPreview" (fun _ ->
120193
121194// Dependencies
122195" Clean"
196+ ==> " CreateKeysIfAbsent"
197+ =?> ( " Version" , hasBuildParam " version" )
123198 ==> " BuildApp"
124199 ==> " Test"
125200 ==> " Build"
126201
127202" Build"
203+ ==> " Docs"
128204 ==> " Release"
129205
130206" DocsPreview"
207+ " BuildApp"
208+ " CreateKeysIfAbsent"
131209" Version"
132210// start build
133211RunTargetOrDefault " Build"
0 commit comments