Roslyn 打包 NuGet 包 BuildTransitive 文件夹用于穿透依赖传递拷贝文件

本文介绍了如何使用 Roslyn 打包 NuGet 包时,通过 BuildTransitive 文件夹实现依赖传递拷贝自定义文件,解决了仅在最底层项目安装库时,可执行项目无法获取资源的问题。详细阐述了创建 BuildTransitive 文件夹并调整 targets 文件的步骤,以及测试验证过程。
摘要由CSDN通过智能技术生成

默认的 PackageReference 可以实现传递依赖,传递依赖的含义是是假定 B 项目安装了 A 库,而 C 项目依赖 B 项目,那么 C 项目将会自然拿到 A 库的 DLL 引用。但默认的 NuGet 包的构建指导文件 targets 命令是不会在传递执行的,也就是如上的 C 项目将不会执行 B 项目安装的 A 库里面的 target 内容 有一些项目需要拷贝自定义文件,例如拷贝图片或者一些 Native 的 DLL 等资源。如 WPF 框架需要拷贝 PenIME 等资源。如果只是在最底层的项目安装了库,那为了让可执行文件项目也输出库的资源,就需要在可执行项目上也安装库。以上的方法的不足在于安装复杂,也许会忘记安装 本文告诉大家一个解决方法是通过在制作库的时候,加上 BuildTransitive 文件夹,在此文件夹内添加构建指导文件,此时这个构建指导文件 targets 文件里面的命令将会在传递中执行,也就是说只需要在底层的项目安装即可,不需要在可执行项目上也安装库

我写了很多 Rolsyn 的关于打包 NuGet 包相关的博客,如 Roslyn 打包自定义的文件到 NuGet 包 这一篇。在这个博客告诉大家如何打包自定义的文件到 NuGet 包,和将自定义的文件放在输出文件夹里面

但是以上方法存在的问题如上文,只有制定了 PackageReference 安装此库的项目,才能将自定义的文件输出。其他的项目,如果只是做传递引用,没有直接在 csproj 上写 PackageReference 安装此库,那么不会拿到自定义输出文件

如果此时自定义的文件是 Native 的 DLL 资源,而只有在底层的库安装了库,那就会让可执行项目输出文件夹没有这些 Native 的 DLL 内容,在运行的时候找不到 Native 的 DLL 文件

为了解决此问题,咱可以将原先写在 Build 文件夹下的 targets 等文件,修改放在 NuGet 包的 BuildTransitive 文件夹。除此之外,其他逻辑都和之前相同

也就是说如果期望在引用传递中,每个引用的项目都会执行到 NuGet 里面的 targets 和 props 文件的命令,只需要将 targets 和 props 文件放入到 BuildTransitive 文件夹即可。其他逻辑都和之前相同

敲黑板,只需要将原本放在 NuGet 里面的 Build 文件夹,重命名为 BuildTransitive 即可

以下是告诉大家如何制作的方法,以及更多细节。本文的代码可以在本文的最后拿到,建议大家试一下本文的测试代码

回顾一下通过 csproj 创建 NuGet 包的方法,如 Roslyn 打包自定义的文件到 NuGet 包 的方法,咱创建一个叫 BuildTransitivePackage 的控制台项目,为了加上指导构建的 targets 等文件,咱需要新建一个 Build 文件夹,在里面放两个文件,文件名如下

  • Package.props
  • Package.targets

为了方便演示,咱来存放一张 Xamarin 的启动图片作为资源文件。期望是在软件的输出文件夹里面可以找到这张图片,换句话说就是这张图片需要放入到 NuGet 包中,接着输出到安装了此库的项目的输出文件夹

此图片文件放在 Assets 文件夹下,默认的启动图片是 SplashScreen.scale-400.png 文件

  • Assets\SplashScreen.scale-400.png

接下来是本文的重点,咱来新建 BuildTransitive

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值