.Net Core 項目中的包引用探索(使用VSCode)


本文組織有點亂,先說結論吧:

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,而是工程根目錄,這一點值得注意。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM