我之前在文章在生成.net core 3.0程序时不包含nuget库中介绍过如何在开发的时候,输出目录中不包含nuget程序包,这种方式的输出非常清晰,但只能适用于开发环境,再运行环境还是得包含所有的程序集。周末的时候,抽空研究了下如何在运行环境下也能使用这种清晰的发布方式。
首先研究了一下nuget包的搜索方式,当采用不包含nuget库的方式是,build的时候会在"{exe}.runtimeconfig.dev"文件中增加了额外的程序集搜索路径:
{
"runtimeOptions": {
"additionalProbingPaths": [
"C:\Users\Admin\.dotnet\store\|arch|\|tfm|",
"C:\Users\Admin\.nuget\packages"
]
}
}
这种方式在.net fx程序中也是支持的,具体可以看我之前的文章:配置.net程序集搜索路径。.net core 程序启动的时候,首先会根据系统指定的程序集加载位置去搜索依赖的程序集,找不到的时候,会从上面配置的额外的搜索路径再寻找。而这两个路径就是开发环境下nuget的缓存,这就是开发开发环境能运行它的原因。
这两个路径中,第一个稍微特殊些:
"C:\Users\Admin\.dotnet\store\|arch|\|tfm|"
这两个竖线是指代的模板,前面个指定的是rid,后面指的是程序framwork,例如,当前程序对应的路径映射的是
"C:\Users\Admin\.dotnet\store\x64\netcoreapp3.1"
另外,这个配置并非一定要放在"{exe}.runtimeconfig.dev"文件中,也可以直接合并到"{exe}.runtimeconfig"文件中。
有了基础后,我们就可以得知,要实现nuget程序集独立存放,需要进行如下两步:
- build的时候讲nuget包分离出来,存放在额外的路径。
- 在runtimeconfig中指定改路径为程序集搜索路径
其中第2步相对简单,直接修改json配置文件就可以,在build机器上加一个小程序就可以完成。
难点是第一步,一个简单的方式是:如果自己生成的程序集文件名有特定前缀的话,可以根据名称规则来区分,这种方式也不是不行,但不够完善,担心它不靠谱。限于篇幅所限,在下一篇文章中我再介绍下如何分离nuget程序包。