再次回到命令行,让我们运行前面的“dotnet test HeyWorld.Tests/HeyWorld.Tests.csproj”命令,希望看到这样的结果:
Build started, please wait...Build completed.Test run for /Users/jeremydmiller/code/DotNetCliArticle/HeyWorld.Tests/bin/Debug/netcoreapp2.1/HeyWorld.Tests.dll(.NETCoreApp,Version=v2.1)Microsoft (R) Test Execution Command Line Tool Version 15.7.0Copyright (c) Microsoft Corporation. All rights reserved.Starting test execution, please wait...Total tests: 1. Passed: 1. Failed: 0. Skipped: 0.Test Run Successful.Test execution time: 2.4565 Seconds
好了,现在测试通过了,让我们运行实际的应用程序。由于“dotnet new webapi”模板使用进程内的 in-process Kestrel web server 来处理HTTP请求,所以要运行新的HeyWorld应用程序,我们唯一需要做的一件事就是从命令行使用以下命令启动它:
dotnet run --project HeyWorld/HeyWorld.csproj
运行上面的命令应该会得到如下输出:
Using launch settings from HeyWorld/Properties/launchSettings.json...: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[0]User profile is available. Using '/Users/jeremydmiller/.aspnet/DataProtection-Keys' as key repository; keys will not be encrypted at rest.Hosting environment: DevelopmentContent root path: /Users/jeremydmiller/code/DotNetCliArticle/HeyWorldNow listening on: https://localhost:5001Now listening on: http://localhost:5000Application started. Press Ctrl+C to shut down.
要测试我们现在正在运行的新应用程序,只需在浏览器中导航如下:
处理HTTPS设置超出了本文的范围。
请再次注意,我假设所有命令都是在将当前目录设置为解决方案根文件夹的情况下执行的。如果当前目录是一个项目目录,并且只有一个*.csproj。那么,您只需在该目录下键入“dotnet run”即可。现在我们已经有了一个经过测试的web api应用程序,接下来让我们将HeyWorld放到Docker镜像中。使用 the standard template for dockerizing a .NET Core application,我们将向HeyWorld项目添加一个Dockerfile,内容如下:
FROM microsoft/dotnet:sdk AS build-envWORKDIR /appCopy csproj and restore as distinct layersCOPY *.csproj ./RUN dotnet restoreCopy everything else and buildCOPY . ./RUN dotnet publish -c Release -o outBuild runtime imageFROM microsoft/dotnet:aspnetcore-runtimeWORKDIR /appCOPY --from=build-env /app/out .ENTRYPOINT [\u0026quot;dotnet\u0026quot;, \u0026quot;HeyWorld.dll\u0026quot;]
(注意,前面的文本应该保存到项目目录中名为Dockerfile的文本文件中——在本例中是HeyWorld\\Dockerfile)。
因为这篇文章仅仅是关于dotnet cli的,我只想关注Dockerfile中它的两种用法:
1.“dotnet restore”–正如我们在上面学到的,这个命令将解决应用程序的任何Nuget依赖关系。
2.“dotnet publish -c Release -o out”–“dotnet publish”命令将构建指定的项目,并将组成应用程序的所有文件复制到给定位置。在我们的例子中,“dotnet publish”将为HeyWorld本身复制已编译的程序集、从Nuget依赖项引用的所有程序集、配置文件以及csproj文件中引用的任何文件。
请注意,在上面的用法中,我们必须通过使用“-c Release”标志明确地告知“dotnet publish”用“Release”配置编译。那些用于编码的dotnet cli命令(例如“build”、“publish”、“pack”)如果没有指定,将以 “Debug”为默认值。注意这种行为,如果要发布用于生产的Nuget或应用程序,请记住指定“-c Release”或“-configuration Release”。别怪我没提醒你。
为了完成整个周期,我们现在可以使用以下命令通过Docker构建和部署我们的小HeyWorld应用程序:
docker build -t heyworld .docker run -d -p 8080:80 --name myapp heyworld
第一个命令为我们的应用程序“heyworld”构建并本地发布Docker镜像。第二个命令实际上作为一个名为“myapp”的Docker容器运行我们的应用程序。您可以打开浏览器访问“http://localhost:8080”予以验证。 |