如何简单的启动一组dotnet服务,powershell?

引言

我们知道使用dotnet命令可以方便的启动c#程序,假如我有一组相互关联的服务,一般在测试的时候可以打开多个visual studio启动新实例

不过这只在需要调试它们的时候才有必要,一般也只需要分别在bin\debug中启动命令就行

每天写代码的时候都去启动这些服务未免有些麻烦,因此有了这篇文章.

解决方案

复杂的解决方案

要用命令行启动这些服务是要解决一些问题的,最关键的是状态检测;因为你直接用dotnet命令启动的是一个dotnet命令行窗口

一旦有多个服务启动了,且每个服务有很多的日志你就不知道哪些服务没启动成功;下面放出我写的一个示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# 确保管理员权限运行脚本
if (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
{
$arguments = "& '" +$myinvocation.mycommand.definition + "'"
Start-Process powershell -Verb runAs -ArgumentList $arguments
Break
}

$version="net5.0"
# 相对路径启动dll
$dlls=@(
"XXXX.XXXX"
"YYYY.YYYY"
)

# $dlls | ForEach-Object { &()}
for ( $index = 0; $index -lt $dlls.count; $index++)
{
# $path=" $PSScriptRoot\{0}\bin\Debug\$version\{0}.dll" -f $dlls[$index]
$dllName=$dlls[$index];

$path=" $PSScriptRoot\{0}\bin\Debug\$version\" -f $dllName

$cmd='cd '+ $path;
Invoke-Expression $cmd

$file=$path+$dllName+".dll"

cmd.exe /c "start ""$dllName"" powershell.exe -NoExit -Command ""dotnet .\$dllName.dll"""

"$dllName execed"
}

# 绝对路径启动dll
$exes=@(
"D:ZZZZ\bin\Debug\$version",
"D:XXXX\bin\Debug\$version"
)
for ( $index = 0; $index -lt $exes.count; $index++)
{
# $path=" $PSScriptRoot\{0}\bin\Debug\$version\{0}.dll" -f $dlls[$index]
$path=$exes[$index]

$cmd='cd '+ $exes[$index];
Invoke-Expression $cmd

$name=Get-ChildItem -filter *.exe -name
$name=[System.IO.Path]::GetFileNameWithoutExtension($name)
$file=$path+$name

cmd.exe /c "start ""$file"" powershell.exe -NoExit -Command ""dotnet .\$name.dll"""


"$file execed"
}

"all server started."

这里还推荐使用Seq,方便在启用这些服务后查看日志。


以上为文章原文:

下面放出简单的解决方案:

简单的解决方案

那就是Tye

使用Tye,只需要:

  • 安装tye命令行工具
1
dotnet tool install -g Microsoft.Tye --version "0.11.0-alpha.22111.1"
  • 编写程序启动yaml配置文件
1
2
3
4
5
6
7
8
9
10
11
12
name: servername
services:
- name: identityService
project: .\InterFace\xxxx.IdentityService.csproj
build: false #不编译项目直接启动
bindings:
- port: 8080
- name: xxxxService
project: .\InterFace\xxxxService.csproj
build: false
bindings:
- port: 8088
  • 使用tye run D:\test\tye.yml或直接使用tye run启动工具
  • 打开localhost:8000查看服务启动情况

tye dashboard

现在,你的服务都由tye帮你接管了

参考资料


如何简单的启动一组dotnet服务,powershell?
http://blog.wangshuai.app/2022-03-23-如何简单的启动一组dotnet服务(powershell)/
作者
王帅
发布于
2022年3月23日
许可协议