使用IncludeAllContentForSelfExtract时如何排除NuGet相关目录?
排除单文件程序中PowerShell SDK的ref和runtimes目录
要解决单文件打包后仍包含ref和runtimes目录的问题,直接用ExcludeFromSingleFile项即可,无需依赖自定义Target删除目录。
解决方案:修改项目文件
在项目的<ItemGroup>中添加ExcludeFromSingleFile项,指定要排除的目录路径,MSBuild在单文件打包时会自动跳过这些内容:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net8.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <RuntimeIdentifier>win10-x64</RuntimeIdentifier> <Nullable>enable</Nullable> <!-- 启用自解压单文件 --> <PublishSingleFile>true</PublishSingleFile> <IncludeAllContentForSelfExtract>true</IncludeAllContentForSelfExtract> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.PowerShell.SDK" Version="7.4.0-preview.1"/> <!-- 排除单文件打包中的ref和runtimes目录 --> <ExcludeFromSingleFile Include="ref\**" /> <ExcludeFromSingleFile Include="runtimes\**" /> </ItemGroup> </Project>
为什么之前的自定义Target无效?
你之前用CustomAfterBuild删除输出目录的ref和runtimes目录,但单文件打包的文件收集逻辑不依赖Build阶段的输出目录:MSBuild在Publish过程中会直接从NuGet包缓存、项目依赖的中间输出目录中收集文件,而非读取你删除后的Build输出目录。所以即使删除了Build输出的目录,打包时仍会重新引入这些内容。
额外说明
如果需要保留Build阶段删除目录的操作(比如本地调试时清理输出),可以保留原有的CustomAfterBuild目标,但它不影响单文件打包的结果,核心还是靠ExcludeFromSingleFile来控制打包内容。
内容的提问来源于stack exchange,提问作者ALIENQuake
相关产品推荐
相关产品推荐

