11using Microsoft . Build . Evaluation ;
2+ using NuGet . Build . Tasks ;
23using NuGet . Common ;
34using NuGet . Frameworks ;
45using NuGet . LibraryModel ;
@@ -136,6 +137,52 @@ public virtual List<PackageReference> GetPackageReferences()
136137 globalProperties : properties ,
137138 toolsVersion : null ) ;
138139
140+ var globalPackageReferences = new List < PackageReference > ( ) ;
141+ var centralPackageVersions = new Dictionary < string , string > ( StringComparer . OrdinalIgnoreCase ) ;
142+ var manageCentrally = project . GetPropertyValue ( "ManagePackageVersionsCentrally" ) ;
143+ if ( string . Equals ( manageCentrally , "true" , StringComparison . OrdinalIgnoreCase ) )
144+ {
145+ foreach ( ProjectItem item in project . GetItems ( "GlobalPackageReference" ) )
146+ {
147+ var packageName = item . EvaluatedInclude ;
148+ var version = item . GetMetadataValue ( "Version" ) ;
149+
150+ if ( ! string . IsNullOrWhiteSpace ( packageName ) && ! string . IsNullOrWhiteSpace ( version ) )
151+ {
152+ if ( VersionRange . TryParse ( version , out var versionRange ) )
153+ {
154+ var packageRef = new PackageReference (
155+ identity : new PackageIdentity ( packageName , null ) ,
156+ targetFramework : ProjectFramework ,
157+ userInstalled : false ,
158+ developmentDependency : false ,
159+ requireReinstallation : false ,
160+ allowedVersions : versionRange ) ;
161+
162+ globalPackageReferences . Add ( packageRef ) ;
163+
164+ if ( Config . TRACE )
165+ Console . WriteLine ( $ " Global package reference: { packageName } = { version } ") ;
166+ }
167+ }
168+ }
169+ references . AddRange ( globalPackageReferences ) ;
170+
171+ foreach ( ProjectItem item in project . GetItems ( "PackageVersion" ) )
172+ {
173+ var packageName = item . EvaluatedInclude ;
174+ var version = item . GetMetadataValue ( "Version" ) ;
175+
176+ if ( ! string . IsNullOrWhiteSpace ( packageName ) && ! string . IsNullOrWhiteSpace ( version ) )
177+ {
178+ centralPackageVersions [ packageName ] = version ;
179+
180+ if ( Config . TRACE )
181+ Console . WriteLine ( $ " Central package version: { packageName } = { version } ") ;
182+ }
183+ }
184+ }
185+
139186 foreach ( ProjectItem reference in project . GetItems ( itemType : "PackageReference" ) )
140187 {
141188 var name = reference . EvaluatedInclude ;
@@ -185,15 +232,32 @@ public virtual List<PackageReference> GetPackageReferences()
185232 continue ;
186233 }
187234
188- var version_metadata = reference . Metadata . FirstOrDefault ( predicate : meta => meta . Name == "Version" ) ;
235+ ProjectMetadata ? version_metadata = reference . Metadata . FirstOrDefault ( predicate : meta => meta . Name == "Version" ) ;
236+ ProjectMetadata ? versionOverride_metadata = reference . Metadata . FirstOrDefault ( predicate : meta => meta . Name == "VersionOverride" ) ;
189237 VersionRange ? version_range ;
190- if ( version_metadata is not null )
238+ if ( versionOverride_metadata is not null )
239+ {
240+ // VersionOverride takes precedence
241+ VersionRange . TryParse (
242+ versionOverride_metadata . EvaluatedValue ,
243+ allowFloating : true ,
244+ out version_range ) ;
245+ if ( Config . TRACE )
246+ Console . WriteLine ( $ " Applied VersionOverride for { name } : { versionOverride_metadata . EvaluatedValue } ") ;
247+ }
248+ else if ( version_metadata is not null )
191249 {
192250 _ = VersionRange . TryParse (
193251 value : version_metadata . EvaluatedValue ,
194252 allowFloating : true ,
195253 versionRange : out version_range ) ;
196254 }
255+ else if ( centralPackageVersions . TryGetValue ( name , out var centralVersionString ) )
256+ {
257+ VersionRange . TryParse ( centralVersionString , out version_range ) ;
258+ if ( Config . TRACE )
259+ Console . WriteLine ( $ " Applied central version for { name } : { centralVersionString } ") ;
260+ }
197261 else
198262 {
199263 if ( Config . TRACE )
@@ -211,31 +275,13 @@ public virtual List<PackageReference> GetPackageReferences()
211275 // }
212276 }
213277
214- PackageReference packref ;
215-
216- if ( version_range == null )
217- {
218- if ( Config . TRACE )
219- Console . WriteLine ( $ " Project reference without version range: { name } ") ;
220-
221- packref = new PackageReference (
222- identity : new PackageIdentity ( id : name , version : null ) ,
223- targetFramework : ProjectFramework ,
224- userInstalled : false ,
225- developmentDependency : false ,
226- requireReinstallation : false ,
227- allowedVersions : VersionRange . All ) ;
228- }
229- else
230- {
231- packref = new PackageReference (
232- identity : new PackageIdentity ( id : name , version : null ) , //(NuGetVersion?)version_range.MinVersion),
233- targetFramework : ProjectFramework ,
234- userInstalled : false ,
235- developmentDependency : false ,
236- requireReinstallation : false ,
237- allowedVersions : version_range ) ;
238- }
278+ var packref = new PackageReference (
279+ identity : new PackageIdentity ( name , null ) ,
280+ targetFramework : ProjectFramework ,
281+ userInstalled : false ,
282+ developmentDependency : false ,
283+ requireReinstallation : false ,
284+ allowedVersions : version_range ?? VersionRange . All ) ;
239285 references . Add ( item : packref ) ;
240286
241287 if ( Config . TRACE )
0 commit comments