.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,而是工程根目录,这一点值得注意。

 

posted @ 2016-08-29 10:25  滴水有灵  阅读(7818)  评论(4编辑  收藏  举报