使⽤.NETCore模板引擎创建⾃定义的模板和项⽬
本⽂是我们 .NET教育系列的⼀部分,该教育系列探讨了 .NET 技术的好处,以及它是如何不仅可以帮助传统的 .NET 开发⼈员,还可以帮助所有想要为市场提供可靠、⾼效且经济的解决⽅案的技术⼈员的。
随着 .NET Core 3.0 的发布,微软拥有了通⽤、模块化、跨平台和开源平台的下⼀个主要版本,该版本最初是在 2016 年发布的。.NET Core 最初是为了⽀持下⼀代 ASP.NET 解决⽅案⽽创建的,但现在它驱动了许多其他场景,包括物联⽹、云和下⼀代移动解决⽅案,并且是这些场景的基础。3.0 版本增加了许多常⽤的特性,⽐如对 WinForms、WPF 和 Entity Framework 6 的⽀持。
由于 .NET Core 对命令⾏的重视,导致它的⼯具发⽣了巨⼤的变化。这⾮常适⽤于 .NET Core 跨平台、
⼯具⽆关的镜像。dotnet CLI 是实现这些优势功能的⼊⼝点,它包含了许多⽤于创建、编辑、构建和打包 .NET Core 项⽬的不同命令。在本⽂中,我们仅关注 dotnet CLI 的⼀个⽅⾯:dotnet new 命令。
该命令主要⽤于创建项⽬,学习过程中,我们经常会创建⼀个简单的样板项⽬,然后就把它忘掉了。本⽂中,我们将学习如何充分利⽤这个命令,通过传递参数来修改已⽣成的项⽬,并将学习如何使⽤该命令来创建⽂件和项⽬。我们还将看到这个⼯具是⼀个成熟的模板引擎,它不仅可以⽤来安装⾃定义模板,还可以⽤来制作个⼈模板。
dotnet new 实践
要怎样使⽤ dotnet new 呢?让我们从头开始,直到出最有趣的部分。要创建⼀个简单的控制台应⽤程序,那么先启动命令⾏,将⽬录切换为⼀个新的空⽂件夹(这是⼀个重要步骤,后⾯将会对此进⾏说明),然后调⽤ dotnet new console:
> dotnet new console
The template "Console Application" was created successfully.
Processing
Running 'dotnet restore' on /Users/matt/demo/MyNewApp/
Restoring packages for /Users/matt/demo/MyNewApp/
Generating MSBuild file /Users/matt/demo/MyNewApp/obj/MyNewApp.props.
Generating MSBuild file /Users/matt/demo/MyNewApp/obj/MyNewApp.argets.
Restore completed in 234.92 ms for /Users/matt/demo/MyNewApp/MyNewApp.csproj.
Restore succeeded.
正如前⾯提到的,⾸先确保我们在⼀个新的空⽂件夹中。默认情况下,dotnet new 将会在当前⽂件夹中创建⽂件,并且不会删除已经存在的⽂件。我们可以使⽤ --output  选项创建⼀个新⽂件夹。例如,可以通过键⼊如下命令在名为 ConsoleApp42 的新⽂件夹中创建项⽬:
> dotnet new console --output ConsoleApp42
The template "Console Application" was created successfully.
Processing
Running 'dotnet restore' on ConsoleApp42/
Restoring packages for /Users/matt/demo/ConsoleApp42/
Generating MSBuild file /Users/matt/demo/ConsoleApp42/obj/ConsoleApp42.props.
Generating MSBuild file /Users/matt/demo/ConsoleApp42/obj/ConsoleApp42.argets.
Restore completed in 309.99 ms for /Users/matt/demo/ConsoleApp42/ConsoleApp42.csproj.app模板网站
Restore succeeded.
看看创建了什么
此时,dotnet new 已经创建了⼀个新的控制台项⽬,并且还原了 NuGet 包(它已经准备好运⾏了)。但是,让我们先看下我们到底创建了什么:
> ls ConsoleApp42/
ConsoleApp42.csproj Program.cs obj/
可以看到,现在有了⼀个基于输出⽂件夹名称的项⽬⽂件。如果我们需要,也可以使⽤ --name 参数来指定⼀个不同的名称:
dotnet new console --output ConsoleApp42 --name MyNewApp
它将在名为 ConsoleApp42 的⽂件夹中创建项⽬⽂件,并使⽤ MyNewApp 作为正在创建的控制台应⽤程序的名称,我们将得到⼀个MyNewApp.csproj。如果我们查看 Program.cs,还将看到该 name 参数也被⽤来更新命名空间了:
using System;
namespace ConsoleApp42
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
}
为另⼀个项⽬做准备
但是,如果我们查看⼀下我们刚才创建的项⽬的⽂件夹⽬录结构,可能会发现它丢失了⼀些内容,它没有解决⽅案⽂件。我们只有⼀个项⽬,虽然它可以在 dotnet run 时正常运⾏,但当我们添加另⼀个项⽬时,它将会引起问题。我们可以轻松创建⼀个项⽬:
该命令将创建⼀个新的空解决⽅案⽂件。然后,向其中添加项⽬是另外的步骤。
如果我们要在演⽰⽰例的根⽂件夹⽬录中创建解决⽅案,命令如下所⽰:
dotnet sln add ConsoleApp42/MyApp.sln
也可以使⽤ dotnet sln 命令删除或列出解决⽅案中的项⽬。如果要添加或删除对项⽬的引⽤,则需要使⽤ dotnet add 命令。我建议⼤家阅读下 Jeremy Miller 的关于可扩展的 dotnet CLI 的⽂章以获取更多详细细节,或者通过键⼊ dotnet help sln 或 dotnet help add 获取。
添加另⼀个项⽬也⾮常简单,但是我们必须以两步的⽅式来完成:创建,然后添加。例如,可以将⼀个测试项⽬添加到解决⽅案中:
dotnet new nunit
dotnet sln add Tests/MyAppTests.csproj
向项⽬添加新⽂件
向项⽬中添加新⽂件甚⾄更加容易,这主要归功于.NET Core 对 MSBuild ⽂件的改进。我们不需要再在.csproj ⽂件中显式地列出 C# ⽂件了,因为它们是通过通配符⾃动获取的。我们只需要在⽂件夹中创建⼀个⽂件,它将⾃动成为项⽬的⼀部分。我们既可以⼿动也可以使⽤dotnet new 提供模板⽂件来创建⽂件。例如,可以使⽤ nunit-test 项模板将⼀个测试⽂件添加到我们的测试项⽬中:
说到模板,我们怎么知道有哪些可⽤的模板呢?如何区分项⽬模板( project template)和项模板(item template)呢?这是 dotnet new --list 的⼯作,它可以输出所有可⽤的模板列表:
模板简称语⾔标签
Console Application console[C#], F#, VB Common/Console
Class library classlib[C#], F#, VB Common/Library
Unit Test Project mstest[C#], F#, VB Test/MSTest
NUnit 3 Test Project nunit[C#], F#, VB Test/NUnit
NUnit 3 Test Item nunit-test[C#], F#, VB Test/NUnit
xUnit Test Project xunit[C#], F#, VB Test/xUnit
Razor Page page[C#]Web/ASP.NET
MVC ViewImports viewimports[C#]Web/ASP.NET
MVC ViewStart viewstart[C#]Web/ASP.NET
ASP.NET Core Empty web[C#], F#Web/Empty
ASP.NET Core Web App (Model-View-Controller)mvc[C#], F#Web/MVC
ASP.NET Core Web App razor[C#]Web/MVC/Razor Pages
ASP.NET Core with Angular angular[C#]Web/MVC/SPA
ASP.NET Core with React.js react[C#]Web/MVC/SPA
ASP.NET Core with React.js and Redux reactredux[C#]Web/MVC/SPA
Razor Class Library razorclasslib[C#]Web/Razor/Library/Razor Class Library
ASP.NET Core Web API webapi[C#], F#Web/WebAPI
global.json file globaljson Config
NuGet Config nugetconfig Config
Web Config webconfig Config
Solution File sln Solution
上述列表列出了所有的模板。使⽤ --type 参数可以进⾏进⼀步的过滤,如使⽤ --type project、–type item 或–type other。项⽬模板将会创建⼀个项⽬,项模板将会创建⼀个⽂件,⽽其他模板仅对 sln 模板创建的解决⽅案⽂件有⽤。
这个列表中的简称(上表第 2 列)是调⽤ dotnet new 时使⽤的名称(例如 dotnet new console、dotnet new classlib、dotnet new mvc 等)。有些模板⽀持多种语⾔,默认语⾔为⽅括号中的(剧透下,它们都是 C#)。我们可以使⽤ --language 选项来选择不同的语⾔,但是要注意#符号!⼀些命令⾏ shell 将其视为注释字符,使⽤–language F# 解析可能会失败。这时可以通过引⽤值 -  “–language F#” 来处理。
最后,每个模板都有⼀个或多个标签。这些标签是⼀种对模板进⾏分类的⽅法,但⽬前它们并不是作为命令⾏⼯具的⼀部分被使⽤。但是,它们可以被其他宿主⽤于分组或过滤。是的,没错,dotnet new 模板引擎可以⽤于其他宿主,⽐如 IDE。稍后再详细介绍。
⾃定义模板
到⽬前为⽌,我们只研究了⼀个⾮常简单的 Hello World 控制台应⽤程序,并添加了⼀些测试。让我们看些更有趣的东西吧。假设要创建⼀个新的 ASP.NET 项⽬。查看上⾯的模板列表,我们有⼏个选择。可以创建⼀个空的 web 项⽬、⼀个 MVC 项⽬、⼀个带有 Angular 的项⽬或者⼀个带有 React.js 的项⽬。但是这些都是相当严格的模板。我们能对这些模版进⾏定制吗?好消息是:可以的。
模板可以接受⼀些变更⽣成内容的参数。 – help 命令将会提供模板所理解的参数的详细信息。让我们从⼀个简单的例⼦开始吧:
> dotnet new classlib
Class library (C
Author: Microsoft
Description: A project for creating a class library that targets .NET Standard or .NET Core
Options:
-f|
netcoreapp2.1 - Target netcoreapp2.1
netstandard2.0 - Target netstandard2.0
Default: netstandard2.0
bool - Optional
Default: false / (*) true
* Indicates the value used if the switch is provided without a value.
在此,我们可以看到 classlib 模板有两个参数:⼀个是 --framework,它⽤于指定要将什么⽬标框架写⼊项⽬⽂件中;另⼀个是 --no-restore,它⽤于控制在创建项⽬时是否执⾏ NuGet 还原。
web 模板也有类似的参数,但是它们的数量⽐我们这⾥列出的要多得多。尝试 dotnet new mvc --help 可以了解更多详细信息。有些参数可以指定⾝份验证类型、是否禁⽤ HTTPS、是否是使⽤ LocalDB 替换 SQLite 等等。这些参数中的每⼀个都会变更模板代码的⽣成⽅式,它们有的是替换⽂件中的内容,有的是根据需要包含或排除⽂件。
当我们讨论帮助⽂档时,有两个⾮常有⽤的命令:dotnet help new,它将在 dotnet new 命令本⾝之上打开⼀个⽹页;dotnet new {template} –help,它将显⽰命名模板及其参数的帮助信息。
添加⾃定义模板
dotnet new 命令的真正强⼤之处在于添加新的⾃定义模板。更好的是,只需要将模版打包到⼀个 NuGet 包中并上传到 上,即可实现模板的分发和共享。这使得开始使⽤⼀个框架或⾃动化创建新项⽬样板或项⽬项样板⾮常容易。
要添加⼀个新的⾃定义模板,使⽤ dotnet new --install {template} 命令,传⼊⼀个 NuGet 包名或⼀个
本地模板的⽂件⽬录。但如何到新的模板呢?
⼀种⽅法是搜索我们正在使⽤的框架,并查看它的模板是否可⽤,但这样做容易出错。幸运的是,我们可以访问
dotnetnew.azurewebsites 并通过关键字搜索模板。⽹站上有超过 500 个模板,这使得它成为了⼀个很好的发现资源的地⽅。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。