在上篇博文.Net core 程序Nuget包独立存放(一)中介绍了运行环境中,如何实现将nuget库存放,还有一个问题没有解决:如何将nuget包从publish的程序集中分离。本文就介绍下如何解决这个问题:
首先,利用dotnet store命令,将nuget包导出,同时并生成目标清单。
dotnet store -m test.csproj -r win-x64 --skip-optimization --skip-symbols -o r:packages
这个命令也可以用于解决方案文件,输出结果如下:
test.csproj 的还原在 488.63 ms 内完成。
Files were composed in r:packagesx64
etcoreapp3.1
The list of packages stored is in r:packagesx64
etcoreapp3.1artifact.xml
其中,展示了nuget包的存储路径,以及程序清单文件。
然后,在发布的时候,指定nuget目标清单,则会裁剪对应的程序包。
dotnet publish --manifest r:packagesx64 etcoreapp3.1artifact.xml
再配合上文的设置,修改xxx.runtimeconfig.json文件,指定程序搜索路径,即可实现nuget包独立存储。
{
"runtimeOptions": {
"tfm": "netcoreapp3.1",
"framework": {
"name": "Microsoft.NETCore.App",
"version": "3.1.0"
},
"additionalProbingPaths": [
"R:\packages\x64\netcoreapp3.1"
]
}
}
该路径也可以写成自适应的方式:
"R:\packages\|arch|\|tfm|"
遇到的问题
实际使用中,就会发现,对于稍微大一点的项目,会存在程序集互相依赖的情况,这个时候dotnet store目录非常容易出错。试了各种参数,也没有找到方法解决。正当我准备放弃的时候,发现了另一种途径。
-
用dotnet list package命令,枚举出解决方案或项目中依赖的所有程序包
-
新建一个简单的工程,将这些程序包囊括进去,一个示例如下:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
<OutputType>Library</OutputType>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="System.Interactive" Version="4.0.0" />
<PackageReference Include="StackExchange.Redis" Version="2.0.601" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.2" />
<PackageReference Include="RabbitMQ.Client" Version="5.1.2" />
</ItemGroup>
</Project>
我的做法是将解决方案的所有Nuget程序包去重后合入一个工程文件,再对这个工程进行dotnet store命令,就非常容易的导出nuget库了。