如何永久阻止ClickOnce包含已排除的LibGit2Sharp相关.so文件?
解决ClickOnce发布时LibGit2Sharp.NativeBinaries平台文件顽固包含的问题
以下是几个可靠的方法,无需移除LibGit2Sharp即可彻底阻止Linux/macOS原生文件进入ClickOnce发布清单:
1. 通过NuGet引用过滤原生文件(根源解决)
直接在项目文件的PackageReference中配置ExcludeAssets,从根源阻止非Windows平台的原生二进制文件被下载和复制到输出目录:
方案A:仅保留编译所需程序集(完全排除所有原生文件)
<PackageReference Include="LibGit2Sharp" Version="你的版本号"> <ExcludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</ExcludeAssets> <IncludeAssets>compile</IncludeAssets> </PackageReference>
方案B:仅排除非Windows平台的原生文件
如果你需要保留Windows平台的原生文件,可精准排除Linux/macOS的runtime资产:
<PackageReference Include="LibGit2Sharp" Version="你的版本号"> <ExcludeAssets>runtime.linux-*; runtime.osx-*</ExcludeAssets> </PackageReference>
2. 自定义MSBuild目标在发布前清理文件
在项目文件中添加自定义目标,在ClickOnce生成部署清单之前彻底删除发布目录中的非Windows原生文件:
<Target Name="CleanNonWindowsNativeBinaries" BeforeTargets="GenerateDeploymentManifest"> <!-- 删除Linux/macOS目录 --> <RemoveDir Directories="$(PublishDir)lib\linux-*" /> <RemoveDir Directories="$(PublishDir)lib\osx-*" /> <!-- 删除所有.so/.dylib及其deploy文件 --> <Delete Files="$(PublishDir)**\*.so" /> <Delete Files="$(PublishDir)**\*.dylib" /> <Delete Files="$(PublishDir)**\*.so.deploy" /> <Delete Files="$(PublishDir)**\*.dylib.deploy" /> </Target>
这个目标会在生成清单前执行,确保这些文件不会被纳入清单。
3. 配置ClickOnce专属排除规则
使用ClickOnce的ExcludeFromDeployment属性标记需要排除的文件/目录,比单纯的Remove更直接:
<ItemGroup> <!-- 移除内容项标记 --> <Content Remove="lib\linux-**" /> <Content Remove="lib\osx-**" /> <Content Remove="**\*.so" /> <Content Remove="**\*.dylib" /> <None Remove="lib\linux-**" /> <None Remove="lib\osx-**" /> <None Remove="**\*.so" /> <None Remove="**\*.dylib" /> <!-- 标记为ClickOnce排除项 --> <ExcludeFromDeployment Include="lib\linux-**" /> <ExcludeFromDeployment Include="lib\osx-**" /> <ExcludeFromDeployment Include="**\*.so" /> <ExcludeFromDeployment Include="**\*.dylib" /> </ItemGroup>
4. 手动指定Windows原生包(避免间接引入多平台文件)
如果项目中直接或间接引用了LibGit2Sharp.NativeBinaries包,可移除它,转而只引用Windows平台的原生包:
<PackageReference Include="LibGit2Sharp.NativeBinaries.win-x64" Version="对应版本号" />
这样NuGet只会下载Windows平台的原生文件,不会引入Linux/macOS版本。
验证步骤
- 清理项目的
bin、obj目录 - 重新生成并发布,检查
Application Files目录和发布清单,确认非Windows原生文件已被排除
内容的提问来源于stack exchange,提问作者mattia cedone
相关产品推荐
相关产品推荐

