.Net core 程序Nuget包独立存放 (一)

我之前在文章在生成.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程序集独立存放,需要进行如下两步:

  1. build的时候讲nuget包分离出来,存放在额外的路径。
  2. 在runtimeconfig中指定改路径为程序集搜索路径

其中第2步相对简单,直接修改json配置文件就可以,在build机器上加一个小程序就可以完成。

难点是第一步,一个简单的方式是:如果自己生成的程序集文件名有特定前缀的话,可以根据名称规则来区分,这种方式也不是不行,但不够完善,担心它不靠谱。限于篇幅所限,在下一篇文章中我再介绍下如何分离nuget程序包。

原文地址:https://www.cnblogs.com/TianFang/p/12420573.html