排除 nuget 包中与平台无关的资源
2024-11-03 21:35:01

项目中引用了一个第三方包,在编译时输出目录下多了所有平台相关的动态库文件,导致占用了很多不必要的空间。而我只是需要 Windows 平台的资源而已。

RuntimeIdentifier

研究后发现 nuget 包会根据 RuntimeIdentifier 属性决定将哪些平台的资源拷贝到输出目录下。


但我们项目可能存在多种架构的支持,而这个属性却只能写一个RID,怎么办呢?动态地根据当前Platform去设置就行了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<PropertyGroup Condition="'$(RuntimeIdentifier)|$(Platform)' == '|AnyCPU'">
<RuntimeIdentifier>win</RuntimeIdentifier>
</PropertyGroup>
<PropertyGroup Condition="'$(RuntimeIdentifier)|$(Platform)' == '|ARM32'">
<RuntimeIdentifier>win-arm</RuntimeIdentifier>
</PropertyGroup>
<PropertyGroup Condition="'$(RuntimeIdentifier)|$(Platform)' == '|ARM64'">
<RuntimeIdentifier>win-arm64</RuntimeIdentifier>
</PropertyGroup>
<PropertyGroup Condition="'$(RuntimeIdentifier)|$(Platform)' == '|x86'">
<RuntimeIdentifier>win-x86</RuntimeIdentifier>
</PropertyGroup>
<PropertyGroup Condition="'$(RuntimeIdentifier)|$(Platform)' == '|x64'">
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
</PropertyGroup>

这里只简单考虑 Windows 系统,跨平台项目还要加入更多验证条件。


实际上这个属性标准用法是在使用发布功能时由命令行设置或在pubxml文件中指定的。
因为在很早以前没有发布的概念,都是将项目用 Release 编译后就行了。只有在不使用发布功能时才可以考虑自己去设置RuntimeIdentifier

相关阅读

.NET RID Catalog
.NET Core RuntimeIdentifier vs TargetFramework
PortableRuntimeIdentifierGraph.json