我之前在文章在生成.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程序包。