Public/Nuget/Update-NugetPackage.ps1
function Update-NugetPackage { [cmdletbinding()] param( [parameter(ValueFromPipeline)] [string]$SourcePath = ".", [string]$RepositoryPath, [parameter()] [string]$Filter = "*", [string]$sources = ((Get-PackageSourceLocations Nuget) -join ";") ) $configs = Get-ChildItem $sourcePath packages.config -Recurse | ForEach-Object { [PSCustomObject]@{ Content = [xml]$(Get-Content $_.FullName) Config = $_ } } $metadatas = $configs.Content.packages.package.id | Where-Object { $_ -like $Filter } | Select-Object -Unique | Get-NugetPackageSearchMetadata -Source $sources $metadatas|ForEach-Object{ [PSCustomObject]@{ Title=$_.Title Version=$_.Identity.Version.Version } } $packages = $configs | ForEach-Object { $_.Config.FullName $config = $_.Config $_.Content.packages.package | Where-Object { $_.id -like $filter } | ForEach-Object { $packageId = $_.Id $metadata = $metadatas | Where-object { $_.Identity.Id -eq $packageId } if ($metadata) { $csproj = Get-ChildItem $config.DirectoryName *.csproj | Select -first 1 $newVersion=(Get-NugetPackageMetadataVersion $metadata).version [PSCustomObject]@{ Id = $packageId NewVersion = $newVersion Config = $config.FullName csproj = $csproj.FullName Version = $_.Version } } } } | Where-Object { $_.NewVersion -and ($_.Version -ne $_.NewVersion) } $sortedPackages = $packages | Group-Object Config | ForEach-Object { $p = [PSCustomObject]@{ Packages = ($_.Group | Sort-PackageByDependencies) } $p } $sortedPackages | Invoke-Parallel -activityName "Update all packages" -VariablesToImport @("RepositoryPath", "sources") -Script { ($_.Packages | ForEach-Object { if ($RepositoryPath) { & (Get-NugetPath) Update $_.Config -Id $_.Id -Version $($_.NewVersion) -Source $sources -NonInteractive -RepositoryPath $RepositoryPath } else { & (Get-NugetPath) Update $_.Config -Id $_.Id -Version $($_.NewVersion) -Source $sources -NonInteractive } }) } } |