@@ -382,23 +382,61 @@ private static async Task<int> OnInstallCommand(string path, string version, str
382382 const string PrivateAssetsMetadataName = "PrivateAssets" ;
383383 const string VersionMetadataName = "Version" ;
384384
385+ // Check if Central Package Management is enabled
386+ bool isCpmEnabled = IsCentralPackageManagementEnabled ( path ) ;
387+
388+ if ( isCpmEnabled )
389+ {
390+ // Update Directory.Packages.props with PackageVersion
391+ UpdateDirectoryPackagesProps ( path , PackageId , packageVersion ) ;
392+ string directoryPackagesPropsPath = Path . Combine ( path , "Directory.Packages.props" ) ;
393+ context . Stage ( directoryPackagesPropsPath ) ;
394+ }
395+
385396 ProjectItemElement item = propsFile . Items . FirstOrDefault ( i => i . ItemType == PackageReferenceItemType && i . Include == PackageId ) ;
386397
387398 if ( item is null )
388399 {
400+ var metadata = new Dictionary < string , string >
401+ {
402+ { PrivateAssetsMetadataName , "all" } ,
403+ } ;
404+
405+ // Only add Version if CPM is not enabled
406+ if ( ! isCpmEnabled )
407+ {
408+ metadata [ VersionMetadataName ] = packageVersion ;
409+ }
410+
389411 item = propsFile . AddItem (
390412 PackageReferenceItemType ,
391413 PackageId ,
392- new Dictionary < string , string >
393- {
394- { PrivateAssetsMetadataName , "all" } ,
395- { VersionMetadataName , packageVersion } ,
396- } ) ;
414+ metadata ) ;
397415 }
398416 else
399417 {
400- ProjectMetadataElement versionMetadata = item . Metadata . Single ( m => m . Name == VersionMetadataName ) ;
401- versionMetadata . Value = packageVersion ;
418+ if ( isCpmEnabled )
419+ {
420+ // Remove Version metadata if CPM is enabled
421+ ProjectMetadataElement versionMetadata = item . Metadata . FirstOrDefault ( m => m . Name == VersionMetadataName ) ;
422+ if ( versionMetadata is not null )
423+ {
424+ item . RemoveChild ( versionMetadata ) ;
425+ }
426+ }
427+ else
428+ {
429+ // Update Version metadata if CPM is not enabled
430+ ProjectMetadataElement versionMetadata = item . Metadata . FirstOrDefault ( m => m . Name == VersionMetadataName ) ;
431+ if ( versionMetadata is not null )
432+ {
433+ versionMetadata . Value = packageVersion ;
434+ }
435+ else
436+ {
437+ item . AddMetadata ( VersionMetadataName , packageVersion ) ;
438+ }
439+ }
402440 }
403441
404442 item . Condition = "!Exists('packages.config')" ;
@@ -866,6 +904,56 @@ private static async Task<string> GetLatestPackageVersionAsync(string packageId,
866904 return pkg . LatestVersion ? . ToNormalizedString ( ) ;
867905 }
868906
907+ private static bool IsCentralPackageManagementEnabled ( string path )
908+ {
909+ string directoryPackagesPropsPath = Path . Combine ( path , "Directory.Packages.props" ) ;
910+ if ( ! File . Exists ( directoryPackagesPropsPath ) )
911+ {
912+ return false ;
913+ }
914+
915+ return true ;
916+ }
917+
918+ private static void UpdateDirectoryPackagesProps ( string path , string packageId , string packageVersion )
919+ {
920+ string directoryPackagesPropsPath = Path . Combine ( path , "Directory.Packages.props" ) ;
921+ ProjectRootElement propsFile = File . Exists ( directoryPackagesPropsPath )
922+ ? ProjectRootElement . Open ( directoryPackagesPropsPath )
923+ : ProjectRootElement . Create ( directoryPackagesPropsPath ) ;
924+
925+ const string PackageVersionItemType = "PackageVersion" ;
926+ const string VersionMetadataName = "Version" ;
927+
928+ ProjectItemElement item = propsFile . Items . FirstOrDefault ( i =>
929+ i . ItemType == PackageVersionItemType && i . Include == packageId ) ;
930+
931+ if ( item is null )
932+ {
933+ item = propsFile . AddItem (
934+ PackageVersionItemType ,
935+ packageId ,
936+ new Dictionary < string , string >
937+ {
938+ { VersionMetadataName , packageVersion } ,
939+ } ) ;
940+ }
941+ else
942+ {
943+ ProjectMetadataElement versionMetadata = item . Metadata . FirstOrDefault ( m => m . Name == VersionMetadataName ) ;
944+ if ( versionMetadata is not null )
945+ {
946+ versionMetadata . Value = packageVersion ;
947+ }
948+ else
949+ {
950+ item . AddMetadata ( VersionMetadataName , packageVersion ) ;
951+ }
952+ }
953+
954+ propsFile . Save ( directoryPackagesPropsPath ) ;
955+ }
956+
869957 private static string GetSpecifiedOrCurrentDirectoryPath ( string versionJsonRoot )
870958 {
871959 return ShouldHaveTrailingDirectorySeparator ( Path . GetFullPath ( string . IsNullOrEmpty ( versionJsonRoot ) ? "." : versionJsonRoot ) ) ;
0 commit comments