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