msbuild -t:pack打包非SDK格式C#项目时缺失依赖Bar.dll如何解决?
问题原因
非SDK风格的.NET Framework项目执行msbuild -t:pack时,默认会将项目引用识别为NuGet依赖项而非需要打包进当前包的程序集,因此会出现两个问题:一是生成的包内不包含Bar.dll,二是安装时会提示找不到Bar的NuGet包。
解决方案
第一步 修改项目引用配置
打开Foo.csproj,找到指向Bar.csproj的<ProjectReference>节点,新增两个子属性:
<ProjectReference Include="..\Bar\Bar.csproj"> <!-- 原有Project、Name等节点保持不变 --> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> </ProjectReference>
该配置的作用是告知NuGet打包工具,不要将Bar声明为Foo的NuGet依赖项。
第二步 添加Bar.dll打包规则
在Foo.csproj的根<Project>节点下新增如下配置:
<PropertyGroup> <TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);IncludeReferencedBarDll</TargetsForTfmSpecificBuildOutput> </PropertyGroup> <Target Name="IncludeReferencedBarDll" DependsOnTargets="Build"> <ItemGroup> <BuildOutputInPackage Include="$(OutputPath)Bar.dll"> <TargetFramework>net472</TargetFramework> </BuildOutputInPackage> </ItemGroup> </Target>
该规则会在打包流程中自动将编译输出目录下的Bar.dll放入NuGet包对应的lib\net472目录中。
第三步 重新执行打包命令
重新运行msbuild -t:pack Foo.csproj即可生成包含Bar.dll的正常NuGet包。
内容的提问来源于stack exchange,提问作者Placu95
相关产品推荐
相关产品推荐

