惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
P
Palo Alto Networks Blog
T
ThreatConnect
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
T
True Tiger Recordings
P
Privacy & Cybersecurity Law Blog
B
Blog
IT之家
IT之家
Last Week in AI
Last Week in AI
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
C
Comments on: Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
N
News and Events Feed by Topic
NISL@THU
NISL@THU
腾讯CDC
雷峰网
雷峰网
Security Latest
Security Latest
李成银的技术随笔
M
Microsoft Research Blog - Microsoft Research
L
LangChain Blog
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Check Point Blog
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
博客园 - Franky
N
News | PayPal Newsroom
V
V2EX
A
About on SuperTechFans
The Register - Security
The Register - Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google Online Security Blog
Google Online Security Blog
MyScale Blog
MyScale Blog
Cisco Talos Blog
Cisco Talos Blog
Vercel News
Vercel News
WordPress大学
WordPress大学
C
Cyber Attacks, Cyber Crime and Cyber Security
The Hacker News
The Hacker News
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
爱范儿
爱范儿
A
Arctic Wolf
L
LINUX DO - 最新话题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - 陈大欠

Step Builder:让对象构建有顺序、有边界、有校验 基于 Attribute 的 AOP 字段校验 浅析 .NET 响应式编程 IObservable与ReactiveX Cron表达式简明教程 正则表达式拾遗 C# IEquatable和IEqualityComparer 最佳实践 使用XDT提高开发效率 如何保证XML正确性 分析 Dump 入门简明教程 Git commit emoji 对照表 ELK Stack 笔记 HTML5/CSS3(PrefixFree.js) 3D文字特效 Jquery实现图片上下一张 js css 构建滚动边框 使用jquery构建Metro style 返回顶部 使用js实现移动设备访问跳转到指定目录 从一幅图中了解开源世界 Jquery ajax 学习笔记 工欲善其事必先利其器系列之:在VS里面折叠js代码
快速批量升级 NugetPackage 版本
陈大欠 · 2024-01-11 · via 博客园 - 陈大欠

批量升级项目中的 Nuget

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

Newtonsoft.Json 13.0.1 13.0.3 Polly 8.0.0 8.2.1
Name OldVersion NewVersion

以下所有命令都需要在 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> 

参考