1
+ ///////////////////////////////////////////////////////////////////////////////
2
+ // ARGUMENTS
3
+ ///////////////////////////////////////////////////////////////////////////////
4
+
5
+ var target = Argument < string > ( "target" , "Default" ) ;
6
+ var configuration = Argument < string > ( "configuration" , "Release" ) ;
7
+
8
+ //////////////////////////////////////////////////////////////////////
9
+ // EXTERNAL NUGET TOOLS
10
+ //////////////////////////////////////////////////////////////////////
11
+
12
+ #Tool "xunit.runner.console"
13
+ #Tool "GitVersion.CommandLine"
14
+
15
+ //////////////////////////////////////////////////////////////////////
16
+ // EXTERNAL NUGET LIBRARIES
17
+ //////////////////////////////////////////////////////////////////////
18
+
19
+ #addin "Cake.FileHelpers"
20
+ #addin nuget : ? package= Cake . Yaml
21
+ #addin nuget: ? package = YamlDotNet & version = 5.2 .1
22
+
23
+ ///////////////////////////////////////////////////////////////////////////////
24
+ // GLOBAL VARIABLES
25
+ ///////////////////////////////////////////////////////////////////////////////
26
+
27
+ var projectName = "Polly.Caching.Serialization.System.Text.Json" ;
28
+
29
+ var solutions = GetFiles( "./**/*.sln" ) ;
30
+ var solutionPaths = solutions. Select( solution => solution . GetDirectory ( ) ) ;
31
+
32
+ var srcDir = Directory( "./src" ) ;
33
+ var artifactsDir = Directory( "./artifacts" ) ;
34
+ var testResultsDir = artifactsDir + Directory ( "test-results" ) ;
35
+
36
+ // NuGet
37
+ var nupkgDestDir = artifactsDir + Directory ( "nuget-package" ) ;
38
+
39
+ // Gitversion
40
+ var gitVersionPath = ToolsExePath( "GitVersion.exe" ) ;
41
+ Dictionary < string , object > gitVersionOutput ;
42
+ var gitVersionConfigFilePath = "./GitVersionConfig.yaml" ;
43
+
44
+ // Versioning
45
+ string nugetVersion;
46
+ string appveyorBuildNumber;
47
+ string assemblyVersion;
48
+ string assemblySemver;
49
+
50
+ ///////////////////////////////////////////////////////////////////////////////
51
+ // INNER CLASSES
52
+ ///////////////////////////////////////////////////////////////////////////////
53
+ class GitVersionConfigYaml
54
+ {
55
+ public string NextVersion { get ; set ; }
56
+ }
57
+
58
+ ///////////////////////////////////////////////////////////////////////////////
59
+ // SETUP / TEARDOWN
60
+ ///////////////////////////////////////////////////////////////////////////////
61
+
62
+ Setup( _ =>
63
+ {
64
+ Information ( "" ) ;
65
+ Information ( "----------------------------------------" ) ;
66
+ Information ( "Starting the cake build script" ) ;
67
+ Information ( "Building: " + projectName ) ;
68
+ Information ( "----------------------------------------" ) ;
69
+ Information ( "" ) ;
70
+ } ) ;
71
+
72
+ Teardown( _ =>
73
+ {
74
+ Information ( "Finished running tasks." ) ;
75
+ } ) ;
76
+
77
+ //////////////////////////////////////////////////////////////////////
78
+ // PRIVATE TASKS
79
+ //////////////////////////////////////////////////////////////////////
80
+
81
+ Task( "__Clean" )
82
+ . Does ( ( ) =>
83
+ {
84
+ DirectoryPath [ ] cleanDirectories = new DirectoryPath [ ] {
85
+ testResultsDir ,
86
+ nupkgDestDir ,
87
+ artifactsDir
88
+ } ;
89
+
90
+ CleanDirectories ( cleanDirectories ) ;
91
+
92
+ foreach ( var path in cleanDirectories ) { EnsureDirectoryExists ( path ) ; }
93
+
94
+ foreach ( var path in solutionPaths )
95
+ {
96
+ Information ( "Cleaning {0}" , path ) ;
97
+ DotNetCoreClean ( path . ToString ( ) ) ;
98
+ }
99
+ } ) ;
100
+
101
+ Task( "__RestoreNugetPackages" )
102
+ . Does ( ( ) =>
103
+ {
104
+ foreach ( var solution in solutions )
105
+ {
106
+ Information ( "Restoring NuGet Packages for {0}" , solution ) ;
107
+ DotNetCoreRestore ( solution . ToString ( ) ) ;
108
+ }
109
+ } ) ;
110
+
111
+ Task( "__UpdateAssemblyVersionInformation" )
112
+ . Does ( ( ) =>
113
+ {
114
+ var gitVersionSettings = new ProcessSettings ( )
115
+ . SetRedirectStandardOutput ( true ) ;
116
+
117
+ try {
118
+ IEnumerable < string > outputLines ;
119
+ StartProcess ( gitVersionPath , gitVersionSettings , out outputLines ) ;
120
+
121
+ var output = string . Join ( "\n " , outputLines ) ;
122
+ gitVersionOutput = Newtonsoft . Json . JsonConvert . DeserializeObject < Dictionary < string , object > > ( output ) ;
123
+ }
124
+ catch
125
+ {
126
+ Information ( "Error reading git version information. Build may be running outside of a git repo. Falling back to version specified in " + gitVersionConfigFilePath ) ;
127
+
128
+ string gitVersionYamlString = System . IO . File . ReadAllText ( gitVersionConfigFilePath ) ;
129
+ GitVersionConfigYaml deserialized = DeserializeYaml < GitVersionConfigYaml > ( gitVersionYamlString . Replace ( "next-version" , "NextVersion" ) ) ;
130
+ string gitVersionConfig = deserialized . NextVersion ;
131
+
132
+ gitVersionOutput = new Dictionary < string , object > {
133
+ { "NuGetVersion" , gitVersionConfig + "-NotFromGitRepo" } ,
134
+ { "FullSemVer" , gitVersionConfig } ,
135
+ { "AssemblySemVer" , gitVersionConfig } ,
136
+ { "Major" , gitVersionConfig . Split ( '.' ) [ 0 ] } ,
137
+ } ;
138
+
139
+ }
140
+
141
+ Information ( "" ) ;
142
+ Information ( "Obtained raw version info for package versioning:" ) ;
143
+ Information ( "NuGetVersion -> {0}" , gitVersionOutput [ "NuGetVersion" ] ) ;
144
+ Information ( "FullSemVer -> {0}" , gitVersionOutput [ "FullSemVer" ] ) ;
145
+ Information ( "AssemblySemVer -> {0}" , gitVersionOutput [ "AssemblySemVer" ] ) ;
146
+
147
+ appveyorBuildNumber = gitVersionOutput [ "BranchName" ] . ToString ( ) . Equals ( "master" , StringComparison . OrdinalIgnoreCase )
148
+ ? gitVersionOutput [ "FullSemVer" ] . ToString ( )
149
+ : gitVersionOutput [ "InformationalVersion" ] . ToString ( ) ;
150
+ nugetVersion = gitVersionOutput [ "NuGetVersion" ] . ToString ( ) ;
151
+ assemblyVersion = gitVersionOutput [ "Major" ] . ToString ( ) + ".0.0.0" ;
152
+ assemblySemver = gitVersionOutput [ "AssemblySemVer" ] . ToString ( ) ;
153
+
154
+ Information ( "" ) ;
155
+ Information ( "Mapping versioning information to:" ) ;
156
+ Information ( "Appveyor build number -> {0}" , appveyorBuildNumber ) ;
157
+ Information ( "Nuget package version -> {0}" , nugetVersion ) ;
158
+ Information ( "AssemblyVersion -> {0}" , assemblyVersion ) ;
159
+ Information ( "AssemblyFileVersion -> {0}" , assemblySemver ) ;
160
+ Information ( "AssemblyInformationalVersion -> {0}" , assemblySemver ) ;
161
+ } ) ;
162
+
163
+ Task( "__UpdateDotNetStandardAssemblyVersionNumber" )
164
+ . Does ( ( ) =>
165
+ {
166
+ Information ( "Updating Assembly Version Information" ) ;
167
+
168
+ var attributeToValueMap = new Dictionary < string , string > ( ) {
169
+ { "AssemblyVersion" , assemblyVersion } ,
170
+ { "FileVersion" , assemblySemver } ,
171
+ { "InformationalVersion" , assemblySemver } ,
172
+ { "Version" , nugetVersion } ,
173
+ { "PackageVersion" , nugetVersion } ,
174
+ } ;
175
+
176
+ var csproj = File ( "./src/" + projectName + "/" + projectName + ".csproj" ) ;
177
+
178
+ foreach ( var attributeMap in attributeToValueMap ) {
179
+ var attribute = attributeMap . Key ;
180
+ var value = attributeMap . Value ;
181
+
182
+ var replacedFiles = ReplaceRegexInFiles ( csproj , $@ "\<{ attribute } \>[^\<]*\</{ attribute } \>", $@ "<{ attribute } >{ value } </{ attribute } >") ;
183
+ if ( ! replacedFiles . Any ( ) )
184
+ {
185
+ throw new Exception ( $ "{ attribute } version could not be updated in { csproj } .") ;
186
+ }
187
+ }
188
+
189
+ } ) ;
190
+
191
+ Task( "__UpdateAppVeyorBuildNumber" )
192
+ . WithCriteria ( ( ) => AppVeyor . IsRunningOnAppVeyor )
193
+ . Does ( ( ) =>
194
+ {
195
+ AppVeyor . UpdateBuildVersion ( appveyorBuildNumber ) ;
196
+ } ) ;
197
+
198
+ Task( "__BuildSolutions" )
199
+ . Does ( ( ) =>
200
+ {
201
+ foreach ( var solution in solutions )
202
+ {
203
+ Information ( "Building {0}" , solution ) ;
204
+
205
+ var dotNetCoreBuildSettings = new DotNetCoreBuildSettings {
206
+ Configuration = configuration ,
207
+ Verbosity = DotNetCoreVerbosity . Minimal ,
208
+ NoRestore = true ,
209
+ MSBuildSettings = new DotNetCoreMSBuildSettings { TreatAllWarningsAs = MSBuildTreatAllWarningsAs . Error }
210
+ } ;
211
+
212
+ DotNetCoreBuild ( solution . ToString ( ) , dotNetCoreBuildSettings ) ;
213
+ }
214
+ } ) ;
215
+
216
+ Task( "__RunTests" )
217
+ . Does ( ( ) =>
218
+ {
219
+ foreach ( var specsProj in GetFiles ( "./src/**/*.Specs.csproj" ) ) {
220
+ DotNetCoreTest ( specsProj . FullPath , new DotNetCoreTestSettings {
221
+ Configuration = configuration ,
222
+ NoBuild = true
223
+ } ) ;
224
+ }
225
+ } ) ;
226
+
227
+ Task( "__CreateSignedNugetPackage" )
228
+ . Does ( ( ) =>
229
+ {
230
+ var packageName = projectName ;
231
+
232
+ Information ( "Building {0}.{1}.nupkg" , packageName , nugetVersion ) ;
233
+
234
+ var dotNetCorePackSettings = new DotNetCorePackSettings {
235
+ Configuration = configuration ,
236
+ NoBuild = true ,
237
+ OutputDirectory = nupkgDestDir
238
+ } ;
239
+
240
+ DotNetCorePack ( $@ "{ srcDir } \{ projectName } .sln", dotNetCorePackSettings ) ;
241
+ } ) ;
242
+
243
+ //////////////////////////////////////////////////////////////////////
244
+ // BUILD TASKS
245
+ //////////////////////////////////////////////////////////////////////
246
+
247
+ Task( "Build" )
248
+ . IsDependentOn ( "__Clean" )
249
+ . IsDependentOn ( "__RestoreNugetPackages" )
250
+ . IsDependentOn ( "__UpdateAssemblyVersionInformation" )
251
+ . IsDependentOn ( "__UpdateDotNetStandardAssemblyVersionNumber" )
252
+ . IsDependentOn ( "__UpdateAppVeyorBuildNumber" )
253
+ . IsDependentOn ( "__BuildSolutions" )
254
+ . IsDependentOn ( "__RunTests" )
255
+ . IsDependentOn ( "__CreateSignedNugetPackage" ) ;
256
+
257
+ ///////////////////////////////////////////////////////////////////////////////
258
+ // PRIMARY TARGETS
259
+ ///////////////////////////////////////////////////////////////////////////////
260
+
261
+ Task( "Default" )
262
+ . IsDependentOn ( "Build" ) ;
263
+
264
+ ///////////////////////////////////////////////////////////////////////////////
265
+ // EXECUTION
266
+ ///////////////////////////////////////////////////////////////////////////////
267
+
268
+ RunTarget( target ) ;
269
+
270
+ //////////////////////////////////////////////////////////////////////
271
+ // HELPER FUNCTIONS
272
+ //////////////////////////////////////////////////////////////////////
273
+
274
+ string ToolsExePath( string exeFileName ) {
275
+ var exePath = System. IO . Directory . GetFiles ( @"./tools" , exeFileName , SearchOption . AllDirectories ) . FirstOrDefault ( ) ;
276
+ return exePath;
277
+ }
0 commit comments