Каков подходящий рабочий процесс отладки для модулей Powershell Core? - PullRequest
0 голосов
/ 03 сентября 2018

В моей компании есть модуль .NET Powershell, написанный на C #, который позволяет опытным пользователям автоматизировать задачи в нашем продукте. В настоящее время он ориентирован на Powershell 5 с использованием .NET 4.6.1. Мы хотели бы разрешить пользователям, использующим другие операционные системы, использовать его, и поскольку он не имеет кода для конкретной ОС, переносить его было просто.

Однако я не могу найти документацию по рабочему процессу отладки, которой следует следовать. В стандартном .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
  • Присоединение к PID через Присоединение к процессу в Visual Studio

Это работает, и я отладил несколько проблем с этим методом, но это не самый приятный или эффективный способ сделать это. Я считаю, что должен быть лучший способ, который просто недостаточно документирован.

1 Ответ

0 голосов
/ 16 сентября 2018

Я не смог сделать намного лучше, чем шаги, которые я описал в своем вопросе, но я разработал приемлемый для границы сценарий для их запуска, хотя присоединение отладчика требует второго ручного шага. Я наверняка что-то упустил, но, возможно, опыт отладки все еще находится в стадии разработки.

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 в том же каталоге, чтобы запустить команду при запуске сеанса отладки. Вам предлагается подключить отладчик до запуска сценария, но после загрузки модуля.

Как я уже сказал, вряд ли идеально, но, возможно, это поможет кому-то.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...