• 快速批量升级 NugetPackage 版本


    批量升级项目中的 Nuget

    有时候我们需要升级整个解决方案中的某些Nuget版本,如果每个手动使用NuGet Package Manager
    会很麻烦。经过一个周末的踩坑,我找到一个解决方案。

    Name OldVersion NewVersion
    Newtonsoft.Json 13.0.1 13.0.3
    Polly 8.0.0 8.2.1

    以下所有命令都需要在 Visual Studio Package Manager Console (程序包管理控制台) 中执行
    具体路径为:Tools(工具) > NuGet Package Manager(NuGet包管理) > Package Manager Console(程序包管理控制台)

    Get-Package

    先使用Get-Package 命令看一下现有安装包的版本

    PM> Get-Package -ProjectName ClassLibrary1
    
    Id                                  Versions                                 ProjectName                                                                                                                                                                                                       
    --                                  --------                                 -----------                                                                                                                                                                                                       
    Newtonsoft.Json                     {13.0.1}                                 ClassLibrary1                                                                                                                                                                                                     
    Polly                               {8.0.0}                                  ClassLibrary1                                                                                                                                                                                                    
    PM> 

    当前项目安装的是版本 13.0.18.0.0

    Update-Package

    Update-Package命令可以升级指定包

    PM> Update-Package -ProjectName ClassLibrary1 -Id Newtonsoft.Json -Version 13.0.3
    正在还原 D:\Source\Repos\ClassLibrary1\ClassLibrary1.csproj 的包...
    正在安装 NuGet 程序包 Newtonsoft.Json 13.0.3。
    将资产文件写入磁盘。路径: D:\Source\Repos\ClassLibrary1\obj\project.assets.json
    已还原 D:\Source\Repos\ClassLibrary1\ClassLibrary1.csproj (用时 5 毫秒)。
    已从 ClassLibrary1 成功卸载“Newtonsoft.Json 13.0.1”
    已将“Newtonsoft.Json 13.0.3”成功安装到 ClassLibrary1
    执行 nuget 操作花费时间 101 毫秒
    已用时间: 00:00:00.1531212
    PM> 

    批量安装

    为此需要写一段 PowerShell 脚本,先获取整个项目的指定包信息,每个进行判断。如果符合条件则更新。

    # 定义要升级的包 key:packageName value:targetVersion
    # 定义要升级的包 key:packageName value:targetVersion
    $packages = @{
        "Newtonsoft.Json" = "13.0.3";
        "Polly" = "8.2.1";
     };
      
     foreach ($packageName in $packages.Keys) { # 遍历要升级的包
        Write-Host "--------------------$($packageName) BEGIN------------------------";
    
         $targetVersion = $packages[$packageName]; # 获取要升级的版本
         # 获取项目包中已经安装的包信息 see https://learn.microsoft.com/en-us/nuget/reference/ps-reference/ps-ref-get-package
         $projectPackages = Get-Package -Filter $packageName; 
         
         foreach ($projectItem in $projectPackages) { # 处理每一个项目
            Write-Host "--------------------$($projectItem.ProjectName) BEGIN------------------------";
    
            if ($projectItem.Version -lt $targetVersion) { # 如果项目安装版本小于目标版本
                Write-Host "Project: $($projectItem.ProjectName) ↑ $($packageName)";
                Write-Host "Version: $($projectItem.Version) < 目标版本:$targetVersion";
                # 执行升级 see https://learn.microsoft.com/en-us/nuget/reference/ps-reference/ps-ref-update-package
                Update-Package -ProjectName $projectItem.ProjectName $packageName -Version $targetVersion;
            }
    
            Write-Host "--------------------$($projectItem.ProjectName) END------------------------";
        }
    
        Write-Host "--------------------$($packageName) END------------------------";
     }

    输出日志

    两个包都是先卸载,然后安装了指定版本。

    执行的时候脚本代码没有换行而是一整行,在 PowerShell 管道中不支持 Win 换行。所以需要把代码压缩成一行执行。

    PM> $packages = @{"Newtonsoft.Json" = "13.0.3"; "Polly" = "8.2.1"}; foreach ($packageName in $packages.Keys) { Write-Host "--------------------$($packageName) BEGIN------------------------"; $targetVersion = $packages[$packageName]; $projectPackages = Get-Package -Filter $packageName; foreach ($projectItem in $projectPackages) { Write-Host "--------------------$($projectItem.ProjectName) BEGIN------------------------"; if ($projectItem.Version -lt $targetVersion) { Write-Host "Project: $($projectItem.ProjectName) ↑ $($packageName)"; Write-Host "Version: $($projectItem.Version) < 目标版本:$targetVersion"; Update-Package -ProjectName $projectItem.ProjectName $packageName -Version $targetVersion } Write-Host "--------------------$($projectItem.ProjectName) END------------------------" } Write-Host "--------------------$($packageName) END------------------------" }
    --------------------Polly BEGIN------------------------
    --------------------ClassLibrary1 BEGIN------------------------
    Project: ClassLibrary1 ↑ Polly
    Version: 8.0.0 < 目标版本:8.2.1
    正在还原 D:\Source\Repos\ClassLibrary1\ClassLibrary1.csproj 的包...
    正在安装 NuGet 程序包 Polly 8.2.1将资产文件写入磁盘。路径: D:\Source\Repos\ClassLibrary1\obj\project.assets.json
    已还原 D:\Source\Repos\ClassLibrary1\ClassLibrary1.csproj (用时 5 毫秒)。
    已从 ClassLibrary1 成功卸载“Polly 8.0.0已从 ClassLibrary1 成功卸载“Polly.Core 8.0.0已将“Polly 8.2.1”成功安装到 ClassLibrary1
    已将“Polly.Core 8.2.1”成功安装到 ClassLibrary1
    执行 nuget 操作花费时间 117 毫秒
    已用时间: 00:00:00.3168864
    --------------------ClassLibrary1 END------------------------
    --------------------Polly END------------------------
    --------------------Newtonsoft.Json BEGIN------------------------
    --------------------ClassLibrary1 BEGIN------------------------
    Project: ClassLibrary1 ↑ Newtonsoft.Json
    Version: 13.0.1 < 目标版本:13.0.3
    正在还原 D:\Source\Repos\ClassLibrary1\ClassLibrary1.csproj 的包...
    正在安装 NuGet 程序包 Newtonsoft.Json 13.0.3将资产文件写入磁盘。路径: D:\Source\Repos\ClassLibrary1\obj\project.assets.json
    已还原 D:\Source\Repos\ClassLibrary1\ClassLibrary1.csproj (用时 6 毫秒)。
    已从 ClassLibrary1 成功卸载“Newtonsoft.Json 13.0.1已将“Newtonsoft.Json 13.0.3”成功安装到 ClassLibrary1
    执行 nuget 操作花费时间 81 毫秒
    已用时间: 00:00:00.1507802
    --------------------ClassLibrary1 END------------------------
    --------------------Newtonsoft.Json END------------------------
    PM> 

    再次看一下现有安装包的版本,包都被安装为指定版本了。

    PM> Get-Package -ProjectName ClassLibrary1
    
    Id                                  Versions                                 ProjectName                                                                                                                                                                                                       
    --                                  --------                                 -----------                                                                                                                                                                                                       
    Newtonsoft.Json                     {13.0.3}                                 ClassLibrary1                                                                                                                                                                                                     
    Polly                               {8.2.1}                                  ClassLibrary1                                                                                                                                                           
    
    PM> 

    参考


    __EOF__

  • 本文作者: ChenDaqian
  • 本文链接: https://www.cnblogs.com/Chendaqian/p/17959532
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    SpringBoot整合JavaMailSender(发送QQ邮件)
    S5PV210裸机(七):Nand和iNand
    Docker 命令大全
    vue3中<script setup> 和 setup函数的区别
    14.webpack ----Vue源码的打包
    修改软件默认安装到C盘的方法
    数据结构与算法复习:第十弹
    python常用知识梳理(必看篇)
    面试:Android中的HOOK方案
    小玩意 - 一篇带你玩转 SpringBoot 钉钉机器人
  • 原文地址:https://www.cnblogs.com/Chendaqian/p/17959532