.NET Core Command-Line Interface 是開發(fā).NET應(yīng)用程序的基礎(chǔ)開發(fā)工具。
安裝.NET Core CLI
有兩種方式安裝CLI:
- 通過下載安裝包,適用于開發(fā)環(huán)境,要用到本機(jī)的管理員權(quán)限
- 通過shell腳本,適用于服務(wù)器環(huán)境
CLI命令
dotnet工具(稱為驅(qū)動程序)作為cli命令的入口,能夠接收并執(zhí)行命令。同時,它可以選擇要使用的cli的sdk版本,如果未指定版本,默認(rèn)使用最新的sdk版本。如果要指定版本使用dotnet --fx-version <version>命令,dotnet只做兩件事:
-
執(zhí)行命令,格式如下:
dotnet command option,比如:新建一個mvc工程命名為Zebra.Liu.MVC,dotnet new mvc -n Zebra.Liu.MVC -
運(yùn)行程序,格式如下:
dotnet /build/my_app.dll
dotnet命令大致可以分為以下幾類:
- 常規(guī)命令,如
dotnet new,dotnet build,dotnet run等 - 工程類命令
- 項(xiàng)目之間的引用,
dotnet add reference,dotnet list reference,dotnet remove reference - 項(xiàng)目的包管理,
dotnet add package,dotnet remove package
- 項(xiàng)目之間的引用,
- 其他命名,如使用ef,
dotnet ef,啟動文件觀察程序dotnet watch等
常用命令
dotnet build命令
#創(chuàng)建MVC工程
[zebra Desktop]$mkdir work && cd work
[zebra work]$dotnet new console -n Zebra.Liu.Console
#添加Nuget包,這是添加了mysql的驅(qū)動包
[zebra work]$cd Zebra.Liu.Console/
[zebra Zebra.Liu.Console]$dotnet add package Pomelo.EntityFrameworkCore.MySql
[zebra Zebra.Liu.Console]$ls
Program.cs Zebra.Liu.Console.csproj obj
#編譯工程,輸出到build文件夾中
[zebra Zebra.Liu.Console]$dotnet build -o build/
[zebra Zebra.Liu.Console]$ls
Program.cs Zebra.Liu.Console.csproj build obj
#多了一個build文件夾,用于存放編譯后的文件
[zebra Zebra.Liu.Console]$ls build/
Zebra.Liu.Console.dll #二進(jìn)制文件(中間語言IL)
Zebra.Liu.Console.pdb #symbol文件,用于調(diào)試
Zebra.Liu.Console.deps.json # *.deps.json中列出應(yīng)用程序的依賴項(xiàng)
Zebra.Liu.Console.runtimeconfig.dev.json
Zebra.Liu.Console.runtimeconfig.json # 指定共享運(yùn)行時以其版本
上面的試驗(yàn)可以看出build命令最后的產(chǎn)物,如果有項(xiàng)目使用了第三方的依賴,如像上面一樣使用了NuGet中的MySQL驅(qū)動,那么在執(zhí)行build命令時,只會從本機(jī)的NuGet緩存庫中解析依賴項(xiàng),也就是說,生成的dll文件,不包含MySQL的驅(qū)動。這樣build的dll文件,從本機(jī)拷貝到另外的機(jī)器上,可能不能運(yùn)行。如果要將依賴項(xiàng)也打包,可以使用另一個命令dotnet publish。
publish命令和build命令最大的區(qū)別在于:publish命令將應(yīng)用程序的依賴項(xiàng),從NuGet緩存復(fù)制到輸出文件夾中。
build后的程序是否為可執(zhí)行,主要看.csproj文件中的選項(xiàng)
<!-- .csproj文件內(nèi)容 -->
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<!--
OutputType 輸出類型設(shè)置為Exe,說明這個工程,可執(zhí)行
可執(zhí)行的dll和不可執(zhí)行的dll文件最大的區(qū)別在于,有沒有入口點(diǎn)以及是否可執(zhí)行
-->
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.1</TargetFramework>
</PropertyGroup>
</Project>
dotnet clean命令
清除上一個生成的輸出,包括中間文件夾(obj)和最終輸出文件夾(bin)中的文件
dotnet sln命令
使用dotnet sln命令,可以在*.sln,文件中添加,刪除,獲取項(xiàng)目。
dotnet sln [<solution_name>] add <project> <project>
dotnet sln [<solution_name>] add <globbing_pattern>
dotnet sln [<solution_name>] remove <project> <project>
dotnet sln [<solution_name>] remove <globbing_pattern>
dotnet sln [<solution_name>] list
注意:dotnet sln命令只會對solution_name.sln文件中操作,要生成*.sln文件,可以使用dotnet new sln命令
dotnet add/remove/list reference命名
管理項(xiàng)目之間的引用關(guān)系
# 項(xiàng)目1引用項(xiàng)目2
[zebra work]$dotnet add 項(xiàng)目1 reference 項(xiàng)目2
使用CLI創(chuàng)建多項(xiàng)目的解決方案
本章將用cli,按照DDD的分層架構(gòu)來創(chuàng)建包含多個項(xiàng)目的解決方案,方案的結(jié)構(gòu)大致如下:
# 工程目標(biāo)結(jié)構(gòu)
- Shopping.sln
|- Shopping.UI
|- Shopping.Application
|- Shopping.Domain
|- Shopping.Infrastructure
# 工程引用關(guān)系
Shopping.UI
|
V
Shopping.Application
| \
V \
Shopping.Domain \
| \
V V
Shopping.Infrastructure
腳本如下:
# 創(chuàng)建目錄
[zebra ~]$mkdir Shopping && cd Shopping
# 創(chuàng)建工程 UI為MVC類型,其余全部是classlib
[zebra Shopping]$dotnet new mvc -n Shopping.UI
[zebra Shopping]$dotnet new classlib -n Shopping.Application
[zebra Shopping]$dotnet new classlib -n Shopping.Domain
[zebra Shopping]$dotnet new classlib -n Shopping.Infrastructure
# 添加工程之間的引用
[zebra Shopping]$dotnet add Shopping.UI reference Shopping.Application
[zebra Shopping]$dotnet add Shopping.Application reference Shopping.Domain
[zebra Shopping]$dotnet add Shopping.Application reference Shopping.Infrastructure
[zebra Shopping]$dotnet add Shopping.Domain reference Shopping.Infrastructure
# 創(chuàng)建Shopping.sln文件,將工程文件加入到解決方案(.sln)文件中
[zebra Shopping]$dotnet new sln -n Shopping
[zebra Shopping]$dotnet sln add Shopping.*
# 添加NuGet依賴包,這里以在Shopping.Infrastructure工程中添加MySQL驅(qū)動為例
[zebra Shopping]$cd Shopping.Infrastructure/
[zebra Shopping.Infrastructure]$dotnet add package Pomelo.EntityFrameworkCore.MySql