在前段时间我写了一篇迁移 csproj 格式的博客 将 WPF、UWP 以及其他各种类型的旧 csproj 迁移成基于 Microsoft.NET.Sdk 的新 csproj,不过全过程是手工进行的,而且到最后处理 XAML 问题也非常头疼。

现在,我们可以利用工具自动地完成这个过程。当然,工具并不将 csproj 格式进行迁移,而是在不迁移格式的情况下,使用到 PackageReference 方式 NuGet 引用带来的好处。


本文内容
  • 自动升级

  • 检查升级后的兼容性问题

    • install.ps1 脚本将失效

    • 使用 content 方式指定的内容资产将失效

    • XDT 变换将失效

    • lib 根目录中的程序集将被忽略

  • 解决升级后的编译错误

    • 参考资料

自动升级

下载安装 Visual Studio 插件 NuGet PackageReference Upgrader。在安装完成之后,再次启动 Visual Studio,则可以开始迁移。

更新:自 Visual Studio 2017 的 15.7 版本开始,迁移工具已经自带到 Visual Studio 中。详情请参见:Migrating from package.config to PackageReference formats - Microsoft Docs。

只有一个步骤:在 packages.config 文件上点击右键,选择 Upgrade to PackageReference

在弹出的界面中,选择包的版本,确定即可完成一个项目的迁移。

相比于之前写的手工迁移,自动迁移方式没有改变 csproj 的格式,而只是将 NuGet 的引用方式改成了 PackageReference。具体有哪些好处,可以阅读 将 WPF、UWP 以及其他各种类型的旧 csproj 迁移成基于 Microsoft.NET.Sdk 的新 csproj。

检查升级后的兼容性问题

packages.config 的 NuGet 包的管理方式有些功能是 PackageReference 没有的。当然,没有这些功能是因为“不需要”,而不是“还没支持”;所以大部分的迁移都不会发生问题(除非发布包使用的是特别老旧的 nuget.exe,或者发布者利用了一些丧心病狂的黑科技)。

在 Visual Studio 2017 的 15.7 版本以上自带的迁移工具中,会自动列出可能的兼容性问题。

install.ps1 脚本将失效

使用 PackageReference 后,在安装和写在的过程中 install.ps1 脚本将不再执行。如果有一些行为依赖于此脚本,那么这个 NuGet 包的行为可能不正常。

但是,不用担心!install.ps1 的存在是因为 packages.config 不支持 PackageReference 中的一些新特性(例如 NuGet 包中新的目录结构,例如包中自带的 msbuild targets)。所以,如果 NuGet 包在发布时满足目录要求,那么即便 install.ps1 不用执行也能保证包的行为正常。

使用 content 方式指定的内容资产将失效

PackageReference 使用 contentFiles 来管理内容资产,这样可以更好地在多个依赖包之间传递和共享。而此前 content 指定的资产将失效。

建议检查所有依赖的 NuGet 包,如果你有权限修改部分依赖包,那么请使用 contentFiles 来替代 content

XDT 变换将失效

使用 PackageReference 后,在安装和写在的过程中 XDT 转换将不会执行,并且会忽略 .xdt 文件。

在 Web 应用开发中会更留意这个问题。

lib 根目录中的程序集将被忽略

lib 文件夹内的程序集都应该按照目标框架建立子文件夹,例如 net45、netstandard2.0、netcoreapp2.0。PackageReference 要求只能引用在某个目标框架下的程序集。

如果是使用默认的方式创建的 NuGet 包,基本上不会遇到这样的问题。除非你在创建 NuGet 包时有自定义操作在根目录放了程序集。

解决升级后的编译错误

最可能出现的编译问题是 NuGet 包引用的版本冲突。

packages.config 方式的包引用要求在 csproj 文件中显式指定一个依赖的包的版本,于是无论依赖使用了哪个版本,最终都由显式指定的版本来指定。

而 PackageReference 的引用方式是自动管理依赖版本的,只要每个包都在允许的版本范围之内,就自动选择版本,并显示在解决方案的引用中。

PackageReference 出现依赖冲突的提示通常是这样的:

Version conflict detected for NuGet.Versioning. Reference the package directly from the project to resolve this issue.NuGet.Packaging 3.5.0 -> NuGet.Versioning (= 3.5.0)NuGet.Configuration 4.0.0 -> NuGet.Versioning (= 4.0.0)

也就是说,引用的两个不同的包要求依赖相同包的不同版本,于是 PackageReference 无法隐式推断依赖包的版本。这时需要将项目的依赖方式改为之前的方式。

当然,在制作和发布 NuGet 包时,尽量使用非特定版本的依赖包,能够极大地避免这种问题带来的影响。关于如何指定非特定版本的依赖包,可以阅读 Version ranges and wildcards 版本范围和通配符。


参考资料

  • Migrating from package.config to PackageReference formats - Microsoft Docs

  • packages.config (PC) to PackageReference (PR) Migrator · NuGet/Home Wiki

原文地址:https://walterlv.com/post/migrate-packages-config-to-package-reference.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

自动将 NuGet 包的引用方式从 packages.config 升级为 PackageReference相关推荐

  1. nuget包循环引用问题

    1.项目中有类库YesWay.Nlog.RabbitMQ,依赖项如下 YesWay.Nlog.RabbitMQ=>YesWay.Service.Discovery=>YesWay.Log ...

  2. .net stardant 2.0创建及引用说明--Nuget包

    最近因为工作需要,在研究xml的生成前验证,如果有空.字段内容不达要求等情况,就提示错误信息而不是生产xml内容.在进行demo测试后,感觉可以使用了,于是考虑封装成为一个类库,方便后期使用.因为考虑 ...

  3. 项目文件中的已知 NuGet 属性(使用这些属性,创建 NuGet 包就可以不需要 nuspec 文件啦)...

    知道了 csproj 文件中的一些常用 NuGet 属性,创建 NuGet 包时就可以充分发挥新 Sdk 自动生成 NuGet 包的优势,不需要 nuspec 文件啦.(毕竟 nuspec 文件没有 ...

  4. C# 搭建自己的NuGet服务器,上传自定义NuGet包

    第一步搭建NuGet服务器 创建空Web项目 安装Nuget服务,目前最新版本2.8.2 安装完成,会自动生产服务,出现如下界面 发布该网站,并部署至IIS 将.nupkg文件发布至网站的Packag ...

  5. Hello Blazor:(2)集成Tailwind CSS续——nuget包方式

    前段时间,写了一篇"Blazor如何集成Tailwind CSS"的文章.但是操作起来比较麻烦,又是命令行,又是要修改一大堆配置. 后来,我又找到一个更简单的方法. 实现方式 新建 ...

  6. 发布nuget包的正确姿势---cicd自动打包发布

    最轻便的发布nuget包方式,方便cicd自动打包发布nuget包 首先新建项目 项目名随便取,这里就叫它GuiH.ClassLibrary 默认即可,需要改目标版本时,等创建好再改 项目创建好了 随 ...

  7. 引用Nuget包Microsoft.EntityFrameworkCore.Tools.DotNet报错

    错误如下 解决方法 使用VS2017或更高版本在改项目右键,选择"编辑xxx.csproj",并添加如下一句话,就可以成功引用改Nuget包 <PackageReferenc ...

  8. Nuget包制作最佳解决方案

    https://www.cnblogs.com/drea/p/8418717.html 最近研究ABP框架,下载其全套源码,想"据为己有",这样添加功能或者修改源码的话就非常方便了 ...

  9. 使用 dotnet-outdated 维护项目 nuget 包版本

    使用 dotnet-outdated 维护项目 nuget 包版本 Intro 我们项目中或多或少都会有一些 NuGet 包,使用到 NuGet 包时,如何保证我们的 NuGet 包不会太旧呢?我们可 ...

最新文章

  1. 记录某项目中的踩坑与解决(持续更新)
  2. 文本基线怎样去掉_ICML 2020 | 基于类别描述的文本分类模型
  3. GDCM:gdcm::Preamble的测试程序
  4. Net分布式系统之四:RabbitMQ消息队列应用
  5. SAP Fiori Launchpad tile跳转目标的解析逻辑
  6. Android 数据存储之文件存储小记
  7. 洛谷P1856 [USACO5.5]矩形周长Picture
  8. Java基础常见的面试题
  9. 软件行业如何开始创业
  10. AS(强直性脊柱炎)完全手册
  11. 两个PDF比较标出差异_[连玉君专栏]如何检验分组回归后的组间系数差异?
  12. OSChina 周六乱弹 —— 感谢女装红薯开办了这个网站
  13. 微信小程序推荐大全100个
  14. android ogg转mp3,MP3提取转换器
  15. linux环境下tomcat配置PHP
  16. 【RC延迟电路与缓慢泄放电路 】 multisim 14.0仿真 参数计算
  17. 人生需看11个小故事
  18. 海外服务器香港美国服务器哪里的比较好价格便宜的
  19. 3个5相乘列乘法算式_干货 ! 初一数学的21个知识点大总结,再也不怕学不明白...
  20. 2023年复旦大学电子信息(计算机)考研成功经验分享

热门文章

  1. python测试框架数据生成工具最全资源汇总
  2. IE8采用IE7模式
  3. Win10用户远超4亿 Win10 RS2明年年初发布
  4. keepalived 报错 Popt libraries is required
  5. C#学习笔记——通用对话框
  6. CSS Id 和 Class
  7. oracle用户名密码过期引起的网站后台无法登录
  8. 面向对象技术——UML
  9. javaBean【02】javaBean与表单应用
  10. C# 选中 DataGridView 控件中的行时显示不同的颜色