部署包后PowerShell启动.NET Core应用遇当前目录异常问题
解决Octopus Deploy中启动.NET Core应用时工作目录不符的问题
我之前也踩过这个坑!Octopus在完成Deploy Package步骤后,执行后续PowerShell脚本时的默认工作目录确实不是包解压后的目标文件夹,而是它自身的临时工作目录(就是你看到的C:\Octopus\Work...这类路径)。要解决这个问题,核心是拿到部署包的实际安装路径,下面给你两种靠谱的解决方案:
方法一:切换到包的安装目录后启动应用
利用Octopus内置的参数变量可以直接获取到部署包的安装目录,然后切换目录再执行启动命令:
# 获取对应部署步骤的包安装目录(注意替换步骤名称,如果你的Deploy步骤不叫"Deploy Package") $installDirectory = $OctopusParameters["Octopus.Action[Deploy Package].Output.Package.InstallationDirectoryPath"] # 切换到该目录 Set-Location -Path $installDirectory # 可选:打印当前目录验证(调试用) Write-Host "当前工作目录已切换至: $(Get-Item -Path ".").FullName" # 启动.NET Core应用 Start-Process "dotnet" -WindowStyle Hidden -ArgumentList "xxx.dll"
注意:如果你的Deploy Package步骤名称不是默认的"Deploy Package",一定要把变量里的[Deploy Package]改成你实际的步骤名称,比如步骤叫"Deploy My API",变量就写成Octopus.Action[Deploy My API].Output.Package.InstallationDirectoryPath。
方法二:直接指定DLL的完整路径启动
如果不想切换目录,也可以直接把DLL的完整路径作为参数传给dotnet命令:
# 获取包安装目录 $installDirectory = $OctopusParameters["Octopus.Action[Deploy Package].Output.Package.InstallationDirectoryPath"] # 拼接DLL的完整路径 $dllFullPath = Join-Path -Path $installDirectory -ChildPath "xxx.dll" # 启动应用(注意给路径加引号,避免路径含空格时出错) Start-Process "dotnet" -WindowStyle Hidden -ArgumentList "`"$dllFullPath`""
这两种方法都能解决工作目录不对的问题,我个人更常用第一种,因为有些.NET Core应用可能依赖当前目录下的配置文件、静态资源等,切换到安装目录后运行更稳妥。
内容的提问来源于stack exchange,提问作者SiberianGuy
相关产品推荐
相关产品推荐

