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

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


 

自动升级

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

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

紧接着,稍微等待一下,即可完成一个项目的迁移。如果有多个项目,则每个项目都这么操作即可。

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

检查升级后的兼容性问题

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

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 版本范围和通配符


参考资料

自动将 NuGet 包的引用方式从 packages.config 升级为 PackageReference的更多相关文章

  1. 如何最快速地将旧的 NuGet 包 (2.x, packages.config) 升级成新的 NuGet 包 (4.x, PackageReference)

    最近我将项目格式进行了升级,从旧的 csproj 升级成了新的 csproj:NuGet 包管理的方式也从 packages.config 升级成了 PackageReference.然而迁移完才发现 ...

  2. 在VS中自动生成NuGet包以及搭建自己的或单位内部的NuGet服务器

    关于NuGet的介绍已经很多,可以参考下面的: NuGet学习笔记(1)--初识NuGet及快速安装使用 http://kb.cnblogs.com/page/143190/ NuGet学习笔记(2) ...

  3. 【ASP.NET】VS编译成功后自动生成Nuget包

    在VisualStudio项目中,可以在每次编译成功后自动发布nuget包,具体配置过程如下:   1.下载nuget.exe,放置在Visual Studio项目的根目录下.   2.通过命令行生成 ...

  4. nuget包循环引用问题

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

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

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

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

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

  7. nuget 包是如何还原包的

    nuget 是如何还原包的 Intro 一直以来从来都是用 nuget 包,最近想折腾一个东西,需要自己搞一个 nuget 包的解析,用户指定 nuget 包的名称和版本,然后去解析对应的 nuget ...

  8. 自定义Nuget包的技巧一二

    背景: 在项目中, 通常会拆分成核心库(Core)和应用(App)两个部分.核心库由专人维护, 不同的App是不同的团队,但都引用了核心库.当核心库需要升级更新时,有的应用会更新,有的不会--可能是没 ...

  9. .NET Core + EF 报nuget包不兼容

    错误信息如下: 严重性 代码 说明 项目 文件 行 禁止显示状态错误 NU1107 Microsoft.EntityFrameworkCore 中检测到版本冲突.直接安装/引用 Microsoft.E ...

随机推荐

  1. Memcached gets 命令

    Memcached gets 命令获取带有 CAS 令牌存 的 value(数据值) ,如果 key 不存在,则返回空. 语法: gets 命令的基本语法格式如下: gets key 多个 key 使 ...

  2. DLL_Delphi动态调用

    1.动态调用DLL unit formMain; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Co ...

  3. synchornized实现原理

    synchronized是基于Monitor来实现同步的. Monitor 的工作机理: 线程进入同步方法中. 为了继续执行临界区代码,线程必须获取 Monitor 锁.如果获取锁成功,将成为该监视者 ...

  4. NSMutableString和NSString区别,及相互转换方法

    NSString是一个不可变的字符串对象.这不是表示这个对象声明的变量的值不可变,而是表示它初始化以后,你不能改变该变量所分配的内存中的值,但你可以重新分配该变量所处的内存空间.而NSMutableS ...

  5. IE 中的 button type默认值问题

    今天遇到一个问题. 将项目页面的渲染模式从 IE7 改为 IE10 后(<meta http-equiv="X-UA-Compatible" content="IE ...

  6. 【转】R语言知识体系概览

    摘要:R语言的知识体系并非语法这么简单,如果都不了R的全貌,何谈学好R语言呢.本文将展示介绍R语言的知识体系结构,并告诉读者如何才能高效地学习R语言. 最近遇到很多的程序员都想转行到数据分析,于是就开 ...

  7. torch 深度学习(5)

    torch 深度学习(5) mnist torch siamese deep-learning 这篇文章主要是想使用torch学习并理解如何构建siamese network. siamese net ...

  8. Metasploit没有db_autopwn命令的解决办法

    将附件db_autopwn.rp 拷贝到/opt/framework3/msf3/plugins/PS:db_autopwn.rp 下载地址:http://dl.vmall.com/c04w8czlc ...

  9. IOS-源代码管理工具(Git)

    一.简介 什么是git? git是一款开源的分布式版本控制工具 在世界上所有的分布式版本控制工具中,git是最快.最简单.最流行的   git的起源 作者是Linux之父:Linus Benedict ...

  10. scrapy 6023 telnet查看爬虫引擎相关状态

    Telnet终端(Telnet Console) Scrapy提供了内置的telnet终端,以供检查,控制Scrapy运行的进程. telnet仅仅是一个运行在Scrapy进程中的普通python终端 ...