自动将 NuGet 包的引用方式从 packages.config 升级为 PackageReference 发布于 2018-04-24 10:03...PackageReference 要求只能引用在某个目标框架下的程序集。 如果是使用默认的方式创建的 NuGet 包,基本上不会遇到这样的问题。...除非你在创建 NuGet 包时有自定义操作在根目录放了程序集。 解决升级后的编译错误 最可能出现的编译问题是 NuGet 包引用的版本冲突。...而 PackageReference 的引用方式是自动管理依赖版本的,只要每个包都在允许的版本范围之内,就自动选择版本,并显示在解决方案的引用中。...4.0.0) 也就是说,引用的两个不同的包要求依赖相同包的不同版本,于是 PackageReference 无法隐式推断依赖包的版本。
使用新的 SDK 风格的 csproj 的时候,允许 NuGet 包进行依赖传递。...意思是如果我 A 项目安装了库 L 那么如果有 B 项目引用 A 项目,那么自动 B 项目也就安装了库 L 而不需要项目 B 再次手动安装。...本文安利大家一个工具,可以自动了解有哪些项目的哪些库是多余安装的,通过依赖传递就能安装上,不需要手动安装,可以删除 这是一个 dotnet tool 工具,在使用之前需要使用如下命令进行安装 dotnet...,就可以了解具体项目上有哪些库可以删除 在删除掉多余的库之后,就能减少 NuGet 的版本的冲突,也让 csproj 的内容更少,在修改 csproj 的时候的冲突也会更少 此工具在 GitHub 完全开源...%E8%87%AA%E5%8A%A8%E6%89%BE%E5%88%B0%E9%A1%B9%E7%9B%AE%E9%87%8C%E9%9D%A2%E9%87%8D%E5%A4%8D%E7%9A%84-NuGet
正常如果你想写一个 .NET 的 NuGet 包,直接打包就好了,你的引用程序集会出现在 NuGet 包内的 lib 文件夹内。然而,如果我们的 NuGet 包包含本机依赖的话怎么办呢?...包制作方法 在前面的 7 种不同的组合中,我们最终会做出两种不同的包来: 只包含托管依赖或只包含本机依赖的“单包”,其特点为这些依赖只需拷贝到输出目录即可,项目本身不会直接依赖它们的类型(例如通过 P/...同时包含托管依赖和 C++/CLI 依赖的“双包”,其特点为项目会直接使用 C++/CLI 程序集里的类型。 分别介绍制作方法。 本机依赖包(单包) 单包特别好打。...所以如果你不是有特别需要的话,最好还是选单包。 第一步:创建一个普通的类库 第二步:将本机依赖文件拷至对应文件夹下 这里,我们建了一个“Assets”文件夹,用来放 NuGet 的零散文件。...本机依赖包会自动根据 NuGet 的依赖安装 .NET Framework 项目 对于 .NET Framework 项目,项目编译后,NuGet 会自动将本机依赖包里对应架构和框架的文件拷贝到输出目录中
Sdk 自动生成 NuGet 包的优势,不需要 nuspec 文件啦。...NuGet 包就可以不需要 nuspec 文件啦) - 吕毅 NuGet 相关的属性也分为全局属性和项属性两类。...所以很明显——这不是用来给开发者设置的属性,是用于辅助我们生成打包工具的。 配置属性 这些属性会影响生成 NuGet 包的过程。... 引用的项目或包中的指定部分是本项目的依赖项。默认为 all。 引用的项目或包中的指定部分不是本项目的依赖项,应该排除。... 引用的项目或包中的指定部分依然是本项目的依赖项,但是在打 NuGet 包时不作为依赖项(不会传递到下一个项目)。
) 也就是说安装VS的时候会自动包含在工作负载中,对于.net 5 也可以直接安装.NET SDK,如之前.net 知新:【1】 .Net 5 基本概念文章介绍中可以看到.NET SDK是包含了CLI...PackageReference 仅列出那些直接安装在项目中的 NuGet 包,不会显示引用包所包含的低级依赖更加简洁。 比如我们使用nuget安装NPOI包,它的依赖如下: ?...在.net framework的packages.config文件中看到NPOI和它的依赖项 ? 在.net 5项目文件中只有NPOI ? 第二个就是两个工具的功能有差异 ?...创建发布包 首先需要设置属性,创建包需要以下属性。 PackageId,包标识符,在托管包的库中必须是唯一的。 如果未指定,默认值为 AssemblyName。....nuspec 文件是包含包元数据的 XML 清单,.nuspec 当你创建包时将生成。
---- 关于创建跨平台 NuGet 工具包的博客,我写了两篇。...我分为两篇可以减少完成单个任务的理解难度: 如何创建一个基于 MSBuild Task 的跨平台的 NuGet 工具包 如何创建一个基于命令行工具的跨平台的 NuGet 工具包 第零步:前置条件 第一步...,在这个文件夹中的文件会在编译时拷贝到输出目录(保持文件夹结构) + content/ // 这里放 .props 和 .targets 文件,会自动被 NuGet 导入,成为项目的一部分(要求文件名与包名相同...) + build/ // 这里也是放 .props 和 .targets 文件,会自动被 NuGet 导入,成为项目的一部分(要求文件名与包名相同) + buildMultiTargeting/ //...第三步:编写 Target .targets 文件是对项目功能进行扩展的关键文件,由于安装 NuGet 包会自动导入包中的此文件,所以它几乎相当于我们功能的入口。 现在,我们需要徒手编写这个文件了。
如果你希望做一个 NuGet 工具包,那么这个包一定不能作为依赖传递给下一个包。典型的例子,做一个生成版本号的工具 NuGet 包,或者做一个代码分析器。...本文将解决 NuGet 的几个坑,真正做到绝对没有的依赖传递。 ---- 我们遇到了什么问题 如果你使用了 GitVersion 这款 NuGet 包来自动修改你的版本号,那么你可能会遇到这个问题。...如何创建一个基于命令行工具的跨平台的 NuGet 工具包 如何创建一个基于 MSBuild Task 的跨平台的 NuGet 工具包 官方提供的解决方案 官方在非常早期的 2.7 版本就提供了 developmentDependency...至于如何查看自己的 NuGet 版本号,请参见:获取 Nuget 版本号 - 林德熙 我试图寻找的解决方案 为 A 项目添加去除依赖的代码 我们创建一个项目 Walterlv.PackageDemo.A...▲ 项目的结构 以下是 A 项目的 csproj 文件,包含将 Package.targets 在打包 NuGet 包时改名的部分。
迁移到 PackageReference NuGet 引用 引用了Nuget包的旧.NET Framework项目会将引用的Nuget信息记录在packages.config文件中,例如在示例的项目中...要迁移到PackageReference,先尽可能升级引用的Nuget包,然后选中项目中的packages.config,在右键菜单中选中“将 packages.config 迁移到 PackageReference...在弹出的对话框会列出顶级的依赖项和传递的依赖项,还会询问是否将后者升级到顶级依赖项,这个项目无需做任何改变,直接点击“确定”: ? 迁移完成后会得到一个报告: ?...打开Kino.Toolkit.Wpf.csproj,会发现少了些东西,但多了下面这段,这段就是经过精简的Nuget引用,在“管理Nuget程序包”的页面也可以看到已安装的Nuget变少了: ? ?...完成这一步后还原Nuget包,该升级的升级,运行下确认升级没有出错,然后进行下一步。 4.
为了防止运行隐式 NuGet 还原,可以通过上述任意命令使用 --no-restore 标记禁用隐式还原。 指定源 为了还原依赖项,NuGet 需要包所在的源。...若要指定其他源,请执行以下任一项操作: 在项目目录中创建自己的 nuget.config 文件。 有关详细信息,请参阅本文后面介绍的常见 NuGet 配置和 nuget.config 差异。...有关如何使用经过身份验证的源的信息,请参阅使用经过身份验证的源中的包。 全局包文件夹 对于依赖项,可以使用 --packages 参数指定还原操作期间放置还原包的位置。...--force-evaluate 即使锁定文件已存在,也会强制还原以重新评估所有依赖项。 -?|-h|--help 打印出有关如何使用命令的说明。...-s|--source 指定要在还原操作期间使用的 NuGet 包源的 URI。 此设置会替代 nuget.config 文件中指定的所有源。 多次指定此选项可以提供多个源。
升级步骤 step1 :将packages.config迁移到 PackageReference(非必须) 这样做的好处包括精简内容与以及不再需要额外的packages.config文件 step2...:在弹出的对话框会列出顶级的依赖项和传递的依赖项,还会询问是否将后者升级到顶级依赖项,这个项目无需做任何改变,直接点击“确定”: step3:打开Caburn.Micro.Hello.csproj,会发现少了些东西...,但多了下面这段,这段就是经过精简的Nuget引用,在“管理Nuget程序包”的页面也可以看到已安装的Nuget变少了: 3.0.3 <PackageReference Include...支持的WPF的.NET最低版本是4.6.1,所有这些平台在3.x版本中仍然受支持. -. 重大变化,以下是4.0.0版本中包含的更改。 目标平台已更改,以支持新.NET平台版本。
依赖管理是 NuGet 的核心功能。Nuget管理单个项目的依赖关系很容易,只需要每个项目维护自己的Nuget依赖与对应版本。...但是,管理多项目解决方案的依赖关系可能会变得很困难,因为它们的规模和复杂性开始扩大,每个项目依赖的相同的Nuget包的版本可能不同。...在您管理许多不同项目的公共依赖项的情况下,您可以利用 NuGet 的中央包管理功能从一个位置轻松完成所有这些工作。...要开始使用中央包管理,您可以在解决方案的根目录中创建一个 Directory.Packages.props 文件,并将文件中的 ManagePackageVersionsCentrally 属性设置为...,您可以使用您熟悉和喜爱的语法来管理包,但不需要设置包的版本。
典型的例子,做一个生成版本号的工具 NuGet 包,或者做一个代码分析器。 本文将解决 NuGet 的几个坑,真正做到绝对没有的依赖传递。...---- 我们遇到了什么问题 如果你使用了 GitVersion 这款 NuGet 包来自动修改你的版本号,那么你可能会遇到这个问题。...如何创建一个基于命令行工具的跨平台的 NuGet 工具包 如何创建一个基于 MSBuild Task 的跨平台的 NuGet 工具包 官方提供的解决方案 官方在非常早期的 2.7 版本就提供了 developmentDependency...我试图寻找的解决方案 为 A 项目添加去除依赖的代码 我们创建一个项目 Walterlv.PackageDemo.A 模拟前面提到的包 A,创建一个项目 Walterlv.PackageDemo.B 模拟前面提到的包...▲ 项目的结构 以下是 A 项目的 csproj 文件,包含将 Package.targets 在打包 NuGet 包时改名的部分。
我们一直倾听,现在很自豪地介绍从Grpc.Tools NuGet包的1.17版本开始,.NET C#项目中的Protocol Buffer和gRPC服务.proto文件的集成编译。...https://raw.githubusercontent.com/grpc/grpc/master/examples/protos/helloworld.proto 接下来,将必需的NuGet包添加到项目中...首先,默认情况下,.csproj项目文件会自动在其目录中找到所有.cs文件,尽管Microsoft现在建议禁止这种通配行为,所以我们也决定不通配.proto文件。...这是有道理的,因为程序包只包含编译器、代码生成器和导入文件,这些在.proto文件编译的项目之外是不需要的。虽然,在这个简单的演练中并非严格要求,但始终应该是你的标准做法。...分享你的经验 与任何复杂功能的初始版本一样,我们很高兴收到你的反馈。有什么不符合预期的工作?你有不容易用新工具覆盖的场景吗?你是否知道如何改善工作流程?
在发布 CBB 作为 NuGet 包的时候,我期望开发者在使用我的库进行调试,可以自动链接代码到对应打包的 GitHub 上的代码,可以从本地拿到对应的源代码进行调试。...GitHub 的 Action 进行自动构建的时候,打包的 NuGet 包可以链接到本次打包的 commit 的代码,那么只需要安装 Microsoft.SourceLink.GitHub 库,同时额外添加一些配置就可以...-- 本地构建,也许没有记得 commit 就构建,此时的 nuget 包的源代码是不对的,上传上去会让调试诡异 --> <!...在本地构建的时候自动添加了源代码链接,也许本地的代码没有 commit 而此时拿到的 commit 也就不对了,或者本地 commit 了但是没有推送,然后也忘了推,那么开发者拿到的这个 NuGet 包将会找错...在 dotnet 里面使用 pdb 符号文件是用来方便 VS 等工具进行调试,这个文件的作用就是告诉调试工具,对应的代码和二进制 dll 的关系 而在 NuGet 的 nupkg 包不包含 pdb 文件
PackageReference:顾名思义,此元素用于包含对为您的应用程序安装的所有NuGet包的引用。在项目文件中,我们有以下2个NuGet包。...metapackage本身是没有任何的内容的,它只是包含了其他包的依赖信息。 您可以在解决方案资源管理器中的NuGet下找到此元数据包,而NuGet又位于依赖项(Dependencies)下。...展开元数据包时,您可以找到所有依赖项。 ?....NET Core团队建议依赖SDK指定的隐式版本,而不是在包引用上显式设置版本号。 如果目前还不完全清楚,请不要担心。 我们将在即将发布的视频中详细讨论metapackage和隐式版本。...Microsoft.AspNetCore.Razor.Design:此软件包包含对Razor的MSBuild支持,并由Microsoft.AspNetCore.App 的metapackage包引用。
如何最快速地将旧的 NuGet 包 (2.x, packages.config) 升级成新的 NuGet 包 (4.x, PackageReference) 发布于...然而迁移完才发现,这个项目竟然还依赖了大量的从 NuGet 2.x 时代发布的 NuGet 包,这些包并不能在 PackageReference 下好好工作。 于是,我准备将所有这些包都进行升级。...关于自动迁移 NuGet 包管理方式,可以阅读:自动将 NuGet 包的引用方式从 packages.config 升级为 PackageReference - 吕毅。...如果有一些行为依赖于此脚本,那么这个 NuGet 包的行为可能不正常。 但是,不用担心!...所以一小部分特别依赖于 install.ps1 的 NuGet 包是没有办法在新格式中生效的。
在创建独立部署时,.NET Core 工具会自动包含你的应用程序所指向的 .NET Core 版本的最新服务的运行时。 (最新服务的运行时包括安全修补程序和其他 bug 修复程序。)..." /> 如果尚未安装,请下载包含第三方依赖项的 NuGet 包。...若要下载该包,请在添加依赖项后执行 dotnet restore命令。 因为依赖项在发布时已从本地 NuGet 缓存解析出来,因此它一定适用于你的系统。...当为具有此类第三方依赖项的应用程序创建 FDD 时,已发布的输出会针对每个本机依赖项支持(存在于 NuGet 包中)的运行时标识符 (RID) 包含一个文件夹。...,请将包含第三方依赖项的 NuGet 包下载到系统。
阻止某个 NuGet 包意外升级 2018-06-29 09:59 出于兼容性考虑,我们可能不再更新某个项目的 NuGet 包。...然而,团队开发的软件可能因为某个小伙伴不知道这样的历史问题,从而手抖将某个不应该更新的 NuGet 包更新了,于是迁移就挂了。 本文提供了一种方法来避免某些特定 NuGet 包的升级。...▲ 当小伙伴打开包管理器的时候,会发现包版本不一致,然后就不小心升级了 思路 NuGet 使用 PackageReference 来管理所有的包引用,于是我试图通过隐藏 LiteDB 的 PackageReference...而一个典型的隐藏方法便是使用 Target。不在 Target 里面的属性和项是提前计算好的,而 Target 里面的属性和项是编译时才计算的。...搜索 @(PackageReference) 发现有很多的 Target 都依赖于一个名为 CollectPackageReferences 的 Target。
在写 msbuild 的预编译逻辑,如果想要拿到项目安装的 NuGet 库和版本,可以通过获取 PackageReference 的方法获取 获取方法是放在 Target 里面,如下面代码 <Target...% 来引用每一个项(Item)中的元数据 项目文件的代码如下 <TargetFramework...github 请小伙伴自己使用命令行试试 更多编译相关请看手把手教你写 Roslyn 修改编译 其实在 msbuild 里,如果小伙伴读过吕水大大的 帮助官方 NuGet 解掉 Bug,制作绝对不会传递依赖的...NuGet 包 - walterlv 那么贺喜,请试试下面的代码 <TargetFramework...,在这里面更新了一个随意的 NuGet 包,将 PrivateAssets 设置为 123 的值 <Target Name="LaldalllayjeaCawerequrwai" BeforeTargets
Microsoft.NET.Sdk 的目录结构 在打开看 Microsoft.NET.Sdk 的目录结构后,我们可以发现这几乎就是 NuGet 包要求的目录结构。...关于 NuGet 包的目录结构,我在下面两篇文章中都有提到过: 如何创建一个基于 MSBuild Task 的跨平台的 NuGet 工具包 如何创建一个基于命令行工具的跨平台的 NuGet 工具包 官方对...不过,Sdk 类型的 NuGet 包会多一个 Sdk 文件夹。 ?...CollectPackageReferences 用于收集 PackageReference 收集到的所有依赖(也就是 NuGet 包依赖) CoreCompile 核心的编译过程 GenerateAssemblyInfo...欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接: https://walterlv.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布
领取专属 10元无门槛券
手把手带您无忧上云