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