Nuget包中exe文件无法复制到引用项目输出目录的nuspec配置问题
解决方案
以下是两种经过验证的可行方案:
方案1:使用自定义Build Target(最稳定,兼容所有项目格式)
该方案不受contentFiles规则限制,不会触发编译报错,同时支持传递引用场景,是最推荐的实现方式。
- 在你的NuGet包源码目录下创建
build文件夹,新建和你的包ID完全同名的.targets文件,例如包ID为PluginLoader.Native则文件名为PluginLoader.Native.targets,文件内容如下:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Target Name="CopyPluginLoaderExe" AfterTargets="AfterBuild"> <Copy SourceFiles="$(MSBuildThisFileDirectory)..\tools\the.exe" DestinationFolder="$(TargetDir)" SkipUnchangedFiles="true" OverwriteReadOnlyFiles="true" /> </Target> <!-- 可选配置:自动设置引用项目的启动程序为the.exe --> <PropertyGroup> <StartAction>Program</StartAction> <StartProgram>$(TargetDir)\the.exe</StartProgram> </PropertyGroup> </Project>
- 调整你的nuspec配置,确保打包时包含exe和targets文件:
<files> <!-- 将exe打包到包内的tools目录 --> <file src="你本地存放the.exe的路径" target="tools\the.exe" /> <!-- 将targets文件打包到包内的build目录,NuGet会自动导入该文件 --> <file src="build\PluginLoader.Native.targets" target="build\PluginLoader.Native.targets" /> <!-- 如果需要区分目标框架,可以将targets放到build\net5.0等对应子目录下 --> </files>
方案2:修复现有contentFiles配置
你当前的配置不生效大概率是缺失nuspecfiles节点的对应打包配置,或者引用项目使用的是不兼容contentFiles的packages.config格式。
- 先在nuspec的
files节点补充配置,确保本地exe被正确打包到contentFiles对应目录:
<files> <file src="你本地存放the.exe的路径" target="contentFiles\any\net5.0\the.exe" /> </files>
- 保持
contentFiles节点的原有配置即可,不要把buildAction改为Content,避免触发CS2015二进制文件编译报错:
<contentFiles> <files include="any/net5.0/the.exe" buildAction="None" copyToOutput="true" /> </contentFiles>
注意:该方案仅支持使用PackageReference格式的项目,且不支持传递引用(如果A项目引用你的包,B项目引用A项目,B的输出目录不会自动复制exe,方案1无此限制)。
内容的提问来源于stack exchange,提问作者monty
相关产品推荐
相关产品推荐

