本文組織有點亂,先說結論吧:
1 在 project.json 文件中聲明包引用。
而不是像以前那樣可以直接引用 dll。
2 使用 dotnet restore 命令后,nuget 會把聲明的依賴項下載 到本機全局package緩存(如果沒有的話),而不是 以前那樣在解決方案根目錄下創建一個package目錄。
這樣的好處是一台機器共享同一個 package 庫,免得每次都重新下載。
3 在發布時,這些引用的dll會被放到publish目錄中,進入運行環境。
4 如果要引用自己的私有類庫,也需要通過這種方式。
但nuget的官方庫是不會有你的私有類庫的,那么也必須先使用 package 命令打包,然后再引用。打包的方法已經有大神介紹過了,但如何引用還不得而知。也許是先手動拷貝到本地nuget緩存,然后引用,開發與發布。嗯,應該是這樣。
關於這一點,在驗證之后我會專門再寫一篇文章來介紹。
根據這段時間來我對VSCode的理解,VSCode應該是不再支持直接引用 dll 了,而是代以包的概念。所有的類庫都是一個一個的包(package),甚至如果你要引用自己寫的類庫,也得發布成一個 package ,然后以 package 的方式引用。
在 .Net Core 工程中,有兩個文件包含了這些引用依賴信息: project.json, project.json.lock 。其中, project.json由用戶編輯,而 project.json.lock這個文件達到幾百K,其中的內容也不知所雲,大概就是一些平台設置,公共類庫什么的吧,還望以后有機會深入研究。有人說這個 .lock 文件相當於 以前的 .proj 文件,我就不太理解,一個.proj文件主要由 工程文件清單與引用清單組成,最多也就上百行,幾K大小而已,怎么能與 .lock 文件相比呢?
這個 .lock 太神秘了,非常值得研究。但是現在以趕進度為主,暫時先放過它。
主要來研究引用的問題。
在使用 dotnet new 命令產生的project.json全文如下:
{
"version": "1.0.0-*",
"buildOptions": {
"debugType": "portable",
"emitEntryPoint": true
},
"dependencies": {},
"frameworks": {
"netcoreapp1.0": {
"dependencies": {
"Microsoft.NETCore.App": {
"type": "platform",
"version": "1.0.0"
}
},
"imports": "dnxcore50"
}
}
}
其中的 dependencies 節,是記錄依賴關系的。
再使用 yeoman 命令生成 一個新項目,執行 yo aspnet,得到如下選項:
其實在 yeoman 官網上有好多關於 .Net Core 的項目模板,看來看去,還是這個 aspnet 最為好用,所以有了這一個,就不用費心安裝別的模板了。
我們選擇 Web API Application ,看會生成 project.json 中引用了什么:
"dependencies": {
"Microsoft.NETCore.App": {
"version": "1.0.0",
"type": "platform"
},
"Microsoft.AspNetCore.Mvc": "1.0.0",
"Microsoft.AspNetCore.Server.IISIntegration": "1.0.0",
"Microsoft.AspNetCore.Server.Kestrel": "1.0.0",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0",
"Microsoft.Extensions.Configuration.FileExtensions": "1.0.0",
"Microsoft.Extensions.Configuration.Json": "1.0.0",
"Microsoft.Extensions.Configuration.CommandLine": "1.0.0",
"Microsoft.Extensions.Logging": "1.0.0",
"Microsoft.Extensions.Logging.Console": "1.0.0",
"Microsoft.Extensions.Logging.Debug": "1.0.0",
"Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0"
}
看到這個模板項目引用 了一大堆東西,這相當於 使用 Visual Studio 創建工程后默認給你引用的類庫了。
到了這里,可以松一口氣了:至少VSCode在引用方面,是與原來相差不多的。
但是,這些引用的類庫是從哪來的?看起來並不像是基礎類庫,那么在發布的時候會不會作為最終制品的一部分呢?結論是:yes
這些類庫並不像 Visual Studio 中使用PM命令行的 install-package 命令那樣,在根目錄下創建一個packages目錄,這點讓人困惑,這些包到底都放在哪里呢?
它們在當前用戶根目錄下的 .nuget 子目錄下,對於Windows,那就是這里了:
所有的引用的包,都會先下載到這個位置,可能是 dotnet restore 命令的結果。
這是發布到CentOS后的publish目錄,也是程序運行的起始位置。
所以這個結論是顯然的:dependencies 依賴的是非基礎類庫,這些依賴項最終會隨着應用一起進入發布目錄。
當然,對於一個Web應用,環境根目錄並不在publish,而是工程根目錄,這一點值得注意。
