如何禁用NuGet lib文件夹自动程序集引用,仅用targets配置
解决NuGet包中仅通过Targets文件控制程序集引用的问题
要解决MSBuild自动引用lib下程序集导致的冲突问题,你可以按以下步骤配置:
1. 通过假引用禁用自动引用
在你的.nuspec文件中添加<references>元素,指定一个不存在的程序集文件,这样NuGet会跳过自动引用lib目录下的所有程序集,同时不会忽略该元素:
<references> <reference file="Dummy.dll" /> </references>
2. 在Targets文件中配置条件引用
编写.targets文件,根据消费项目的Configuration条件,分别引用对应版本的程序集。示例如下:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <!-- Debug配置引用Debug版本程序集 --> <ItemGroup Condition=" '$(Configuration)' == 'Debug' "> <Reference Include="YourAssembly"> <HintPath>$(MSBuildThisFileDirectory)..\lib\net6.0\YourAssembly.Debug.dll</HintPath> <Private>True</Private> </Reference> </ItemGroup> <!-- Release配置引用Release版本程序集 --> <ItemGroup Condition=" '$(Configuration)' == 'Release' "> <Reference Include="YourAssembly"> <HintPath>$(MSBuildThisFileDirectory)..\lib\net6.0\YourAssembly.Release.dll</HintPath> <Private>True</Private> </Reference> </ItemGroup> </Project>
注意:请根据你的实际框架版本(如net6.0)和程序集命名调整路径与名称。
3. 确保Targets文件被正确打包
在.nuspec的<files>节点中,将Targets文件打包到build目录,同时包含两个版本的程序集:
<files> <file src="build\YourPackage.targets" target="build" /> <file src="lib\net6.0\YourAssembly.Debug.dll" target="lib\net6.0" /> <file src="lib\net6.0\YourAssembly.Release.dll" target="lib\net6.0" /> </files>
完成以上配置后,NuGet包安装到消费项目时,只会根据当前项目的Configuration引用Targets文件中指定的程序集,不会自动导入lib目录下的其他dll,彻底避免引用冲突。
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

