来源https://docs.asp.net/en/latest/dnx/overview.html
.NET Execution Environment (DNX) 是软件开发SDK和运行环境,可以在其上构建和运行跨平台的(Windows,Linux,Mac).NET应用。It provides a host process, CLR hosting logic and managed entry point discovery。 DNX可以运行跨平台的web应用,当然也可以运行其他应用,如控制太应用(但WPF、WCF等是不行的)。
DNX提供了一致的跨平台开发和执行环境。
DNX大幅简化了使用.NET Core开发跨平台应用的工作。It takes care of hosting the CLR, handling dependencies and bootstrapping your application(承载了CLR,处理依赖,启动应用)。可以通过轻量级的Json文件(project.json)来定义项目和解决方案,并构建和发布。
包管理工具彻底改变了现代软件开发,DNX使得方便地创建包。DNX提供了可以安装、创建和管理NuGet包的工具。并且DNX项目对不同目标框架支持交叉编译,然后直接输出NuGet包。你可以在项目中直接引用NuGet包,并自动给你解决依赖问题。当然,你也可以在机器的全局环境下安装开发工具包,用了开发项目。
DNX使得和开源项目更好的协作。通过DNX,你可以很容易的将依赖替换为它的源码,让DNX在运行是编译,方便调试源码,而不用修改项目的其他部分。
DNX项目很简单,就是一个包含project.json的文件夹,项目名称就是文件夹名字。project.json文件定义了包的元信息,如项目依赖,目标框架等,如下
{
"version": "1.0.0-*",
"description": "ClassLibrary1 Class Library",
"authors": [ "daroth" ],
"tags": [ "" ],
"projectUrl": "",
"licenseUrl": "",
"frameworks": {
"net451": { },
"dotnet5.4": {
"dependencies": {
"Microsoft.CSharp": "4.0.1-beta-23516",
"System.Collections": "4.0.11-beta-23516",
"System.Linq": "4.0.1-beta-23516",
"System.Runtime": "4.0.21-beta-23516",
"System.Threading": "4.0.11-beta-23516"
}
}
}
}
文件夹中的文件,除非在project.json中显式排除,都是包含在项目中的。
也可以将命令做为项目的一部分(见commands)。如下
"commands": {
"web": "Microsoft.AspNet.Server.Kestrel",
"ef": "EntityFramework.Commands"
},
通过frameworks属性来指定目标框架。DNX支持交叉编译,在构建NuGet包时,会为每个目标框架创建对应lib文件夹。
你可以用.NET Development Utility (DNU)来构建、打包和发布DNX项目。构建项目产生二进制输出,打包产生NuGet包并可以上传到包管理站点(如http://nuget.org)。发布是收集所有必要运行时构件(必要的DNX和包),放到一个文件夹内,然后就可以作为应用来部署。
详见DNX Projects
DNX中依赖有名字和版本号构成,版本好应该遵从Semantic Versioning。典型的依赖是指NuGet安装包或者其他DNX项目。项目依赖是通过当前项目的同级文件夹或者global.json指定的项目路径。如下
{
"projects": [ "src", "test" ],
"sdk": {
"version": "1.0.0-rc1-final"
}
}
global.json也定义构建项目的最低的DNX版本号(sdk)。
依赖是transitive,你只需要明确最顶层的依赖。使用安装NuGet包,DNX会处理解析完整的依赖图。项目引用在运行时在内存中来解析。这意味这你有完全的灵活性来部署你的DNX项目,可以二进制包的形式,也可以使用源码的方式。
依赖的包首先需要安装,可以使用DNU来给项目安装新的包,或者恢复依赖包。如下命令,下载并安装project.json中的依赖包。
dnu restore
通过配置的package feeds可以恢复包。可以通过NuGet configuration files来配置可以用package feeds。
A command is a named execution of a .NET entry point with specific arguments. 可以在project.json中定义命令。如下
"commands": {
"web": "Microsoft.AspNet.Server.Kestrel",
"ef": "EntityFramework.Commands"
},
可以使用DNX来执行项目中定义的命令,如下
dnx web
命令可以通过NuGet包来构建和分发。可以用DNU来安装全局命令。
dnu commands install MyCommand
更多信息见commands
The DNX application host is typically the first managed entry point invoked by DNX,DNX并负责处理依赖解析,解析project.json文件,提供其他服务并调用应用入口点(invoking application entry point)。
或者,你可以用DNX直接来invoke应用入口。这样做要求应用必须在一个文件夹内构建,所有依赖也要在同一个文件夹内。一般不会使用DNX,而是使用DNX Application Host。
DNX application host通过依赖注入给应用提供了一系列的服务,如IServiceProvider, IApplicationEnvironment and ILoggerFactory。 Application host services can be injected in the constructor of the class for your Main entry point or as additional method parameters to your Main entry point.
编译模块是一个扩展点,可以让你参与到DNX的编译过程中。通过继承ICompileModule接口实现编译模块,并把其放到项目的compiler/preprocess或者compiler/postprocess中。
你可以安装多个版本的DNX,可以使用 .NET Version Manager (DNVM)来安装和管理不同版本的DNX。DNVM可以查看、安装和切换DNX。
详见Getting Start