对于Powershell Core模块合适的调试工作流程是什么?

时间:2018-09-03 20:46:08

标签: powershell debugging .net-core cmdlet powershell-core

我的公司有一个用C#编写的.NET Powershell模块,以允许高级用户自动执行我们产品中的任务。当前,它使用.NET 4.6.1针对Powershell 5。我们希望允许使用其他操作系统的客户也使用它,并且由于它没有特定于操作系统的代码,因此移植起来非常简单。

但是,我找不到应遵循的调试工作流程的文档。在标准.NET Powershell中,这非常简单,并且需要一次性设置过程:

  • 将调试可执行文件配置为Powershell路径
  • 将调试参数设置为加载模块的简短脚本,并在适当的情况下执行正在测试的功能。
  • 打F5

但是,这不适用于Powershell Core。由于项目依赖于NuGet软件包,因此模块注册失败,并显示依赖项错误。我能够弄清楚另一个工作流程,但是它有点钝:

  • 导航到项目目录
  • 执行dotnet publish -f netstandard2.0 -c debug
  • 执行Import-Module ./bin/Debug/netstandard2.0/publish/MyModule.dll
  • 执行$pid来找到PID
  • 通过附加到Visual Studio中的进程来附加到PID

这可行,并且我已经调试了这种方法的一些问题,但这并不是最令人愉快或有效的方法。我相信,必须有一种更好的方法,而只是没有得到很好的记录。

1 个答案:

答案 0 :(得分:1)

我无法比我在问题中描述的步骤做得好得多,但是我想出了一个边界线可接受的脚本来运行它们,尽管附加调试器确实涉及第二个手动步骤。我肯定一定会缺少一些东西,但也许调试经验仍在开发中。

param (
    $Module = "MyModule",
    $Framework = "netstandard2.0",
    $Configuration = "Debug",
    [switch] $ExitWhenComplete
)


try {
    Push-Location $Module
    & dotnet publish -f $Framework -c $Configuration
} finally {
    Pop-Location
}

if ($LASTEXITCODE -ne 0) {
    Write-Warning "Build failed";
    exit 1;
}

$modulePath = [System.IO.Path]::Combine($PSScriptRoot, $Module, "bin", $Configuration, $Framework, "publish", "$Module.dll");
$command = "Import-Module `"$modulePath`"; ";
$command += "Write-Host `"You are now debugging $Module.dll - attach to PID `$pid`"; ";
$command += "Write-Host `"Type 'exit' to quit.`"; ";
$command += "Write-Host; ";

$testScript = "Launch.user.ps1";

if (Test-Path $testScript) {
    $command += "Read-Host `"About to execute $testScript - hit enter to continue.`"; ";
    $command += "& ./$testScript; ";
}

$command += "function prompt { write-host `"[debug] `" -ForegroundColor Yellow; } ";

if ($ExitWhenComplete) {
    $command += "exit; ";
}

& pwsh -NoExit -NoProfile -Command $command;

Write-Host "Pwsh finished executing.";

默认情况下,您可以更新$Module以运行此模块,并在调试会话开始时在同一目录中创建Launch.user.ps1文件以运行命令。在运行脚本之前但在加载模块之后,系统会提示您附加调试器。

正如我说的那样,这并不理想,但这也许可以帮助某人。