Dapr提供了一个预览版 的Dapr Visual Studio Code扩展 ,用于您的Dapr应用程序的本地开发和调试。
观看有关如何使用 Dapr VS 代码扩展的 视频:
Visual Studio Code Remote Containers扩展允许您使用Docker容器作为功能齐全的开发环境,使您可以在容器中进行开发,而无需在本地文件系统中安装任何额外的框架或包。
Dapr 为每种语言的 SDK 预先构建了Docker 远程容器。 您可以选择您的一个选择来选择一个随时制作的环境。 注意这些预制容器自动更新到最新的 Dapr 版本。
Remote-Containers: Add Development Container Configuration Files...
dapr
来过滤列表到可用的 Dapr 远程容器,并选择符合您应用程序的语言容器。 请注意,您可能需要选择 Show All Definitions...
观看有关如何使用应用程序的 Dapr VS 代码远程容器的 视频。
使用 VS Code extension,您可以通过Multi-target debugging同时调试多个Dapr应用程序
如果你想要通过 tasks.json 和 launch.json 文件配置一个项目使用Dapr而又不想使用 Dapr VS Code extension,这里有一些手动步骤说明。
开发 Dapr应用程序时,您通常使用 dapr cli 来启动你自定义的dapr服务,就像这样:
dapr run --app-id nodeapp --app-port 3000 --dapr-http-port 3500 app.js
这将生成组件的 yaml 文件(如果它们不存在),以便您的服务能够与本地的redis 容器交互。 作为一个入门方法这很好用,但是如果你想要附加一个调试器到你的服务来进行代码调试呢? 您可以在这里使用 dapr 运行时(daprd) 来帮助实现这一点。
将调试器附加到您的服务中的一种方法是先从命令行中运行符合正确参数的 daprd,然后启动您的代码并附加调试器。 虽然这完全是一个可以接受的解决方案,但它也需要一些额外的步骤,以及对那些可能想要克隆你的仓库并点击 “play “按钮开始调试的开发人员进行一些指导。
使用 tasks.json 和 launch.json 文件在 Visual Studio 代码中 您可以简化过程并要求 VS Code 在启动调试器之前启动 daprd 进程。
让我们开始吧!
在您的 launch.json 文件中,为您想要 daprd 启动的每个配置添加一个 preLaunchTask。 preLaunchTask 将引用您在 tasks.json 文件中定义的任务。 这里是 Node 和 .NET Core 的一个例子。 注意 preLaunchTasks 参考:daprd-web 和 daprd-leadboard。
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Node Launch w/Dapr (Web)",
"preLaunchTask": "daprd-web",
"program": "${workspaceFolder}/Game/Web/server.js",
"skipFiles": [
"<node_internals>/**"
]
},
{
"type": "coreclr",
"request": "launch",
"name": ".NET Core Launch w/Dapr (LeaderboardService)",
"preLaunchTask": "daprd-leaderboard",
"program": "${workspaceFolder}/Game/Services/LeaderboardService/bin/Debug/netcoreapp3.0/LeaderboardService.dll",
"args": [],
"cwd": "${workspaceFolder}/Game/Services/LeaderboardService",
"stopAtEntry": false,
"serverReadyAction": {
"action": "openExternally",
"pattern": "^\\s*Now listening on:\\s+(https?://\\S+)"
},
"env": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"sourceFileMap": {
"/Views": "${workspaceFolder}/Views"
}
}
]
}
您需要在您的 tasks.json 文件中定义一个 daprd 任务和问题匹配器(problem matcher)。 这里有两个示例(均通过上述 preLaunchTask 成员引用。 注意,在 .NET Core daprd 任务(dpred -leaderboard)的情况下,还有一个dependsOn成员,它引用构建任务,以确保最新的代码正在运行/调试。 用了 problemMatcher,这样当 daprd 进程启动和运行时,VSCode 就能够知道。
让我们大概看看正在传递到 daprd 命令的参数吧。
dapr init
的时候创建) > 注意: 您将需要确保您为您创建的每个dapr-grpc (-dapr-http-port 和 -dapr-grpc-port) 指定不同的 http/grpc 端口, 否则,当您尝试启动第二个配置时将端口冲突。注意: 您将需要确保您为您创建的每个dapr-grpc (-dapr-http-port 和 -dapr-grpc-port) 指定不同的 http/grpc 端口, 否则,当您尝试启动第二个配置时将端口冲突。
{
"version": "2.0.0",
"tasks": [
{
"label": "build",
"command": "dotnet",
"type": "process",
"args": [
"build",
"${workspaceFolder}/Game/Services/LeaderboardService/LeaderboardService.csproj",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary"
],
"problemMatcher": "$msCompile"
},
{
"label": "daprd-web",
"command": "daprd",
"args": [
"-app-id",
"whac-a-mole--web",
"-app-port",
"3000",
"-dapr-http-port",
"51000",
"-dapr-grpc-port",
"52000",
"-placement-host-address",
"localhost:50005"
],
"isBackground": true,
"problemMatcher": {
"pattern": [
{
"regexp": ".",
"file": 1,
"location": 2,
"message": 3
}
],
"background": {
"beginsPattern": "^.*starting Dapr Runtime.*",
"endsPattern": "^.*waiting on port.*"
}
}
},
{
"label": "daprd-leaderboard",
"command": "daprd",
"args": [
"-app-id",
"whac-a-mole--leaderboard",
"-app-port",
"5000",
"-dapr-http-port",
"51001",
"-dapr-grpc-port",
"52001",
"-placement-host-address",
"localhost:50005"
],
"isBackground": true,
"problemMatcher": {
"pattern": [
{
"regexp": ".",
"file": 1,
"location": 2,
"message": 3
}
],
"background": {
"beginsPattern": "^.*starting Dapr Runtime.*",
"endsPattern": "^.*waiting on port.*"
}
},
"dependsOn": "build"
}
]
}
一旦您进行了所需的更改, 您应该能够在 VSCode 中切换到 debug 视图,然后点击“play”按钮来启动您的调试配置。 如果所有配置正确, 您应该在 VSCode 终端窗口中看到数据启动, debugger 应该附加到您的应用程序(您应该在调试窗口中看到它的输出)。