Подтвердить что ты не робот

Как отладить install.ps1 script пакета NuGet

Таким образом, мы можем включить скрипты install/uninstall powershell в пакет NuGet. Я попытался, но мой install.ps1 не работает. Есть ли возможность узнать почему? Отладка, ведение журнала, что-нибудь?

Обновление

Обратите внимание, что script выполняется как часть процесса установки пакета Nuget. Это может быть очень Nuget-специфическим.

4b9b3361

Ответ 1

Возможно, я опаздываю на вечеринку, но вот решение для отладки конкретных сценариев NuGet, пакета NuGet NuGetDebugTools. Его script Add-Debugger.ps1 добавляет простой и вместе с тем эффективный отладчик в консоль диспетчера пакетов NuGet.

Пример сценария:

  • запустите Visual Studio
  • откройте консоль NuGet и введите команды

    PM> Add-Debugger [-ReadHost]
    PM> Set-PSBreakpoint -Command init
    PM> Set-PSBreakpoint -Command install
    

(или установите более конкретные точки останова, см. help Set-PSBreakpoint)

  • откройте решение Visual Studio или вызовите Install-Package XYZ для уже открытого
  • диалог ввода отладчика появляется на любом вызове init.ps1 и install.ps1
  • введите? как ввод отладчика и посмотреть, что вы можете сделать:

    s, StepInto  Step to the next statement into functions, scripts, etc.
    v, StepOver  Step to the next statement over functions, scripts, etc.
    o, StepOut   Step out of the current function, script, etc.
    c, Continue  Continue operation (also on empty input).
    q, Quit      Stop operation and exit the debugger.
    ?, h         Display this help message.
    r            Display PowerShell command history.
    k            Display call stack (Get-PSCallStack).
    <number>     Show debug location in context of <number> lines.
    +<number>    Set location context preference to <number> lines.
    <command>    Invoke any PowerShell <command> and write its output.
    
  • введите другие команды отладчика и PowerShell и посмотрите вывод в консоли NuGet


v1.4.0. Новый коммутатор ReadHost сообщает использовать Read-Host для ввода вместо поля ввода графического интерфейса по умолчанию.

Ответ 2

Вот как мне удалось выполнить шаг за шагом install.ps1 с помощью PowerShell ISE:

Чтобы выполнить выполнение установки script с помощью PowerShell ISE, выполните следующие действия: Включить выполнение сборок, построенных с помощью .Net 4

Либо

C:\Windows\System32\WindowsPowerShell\v1.0 Или

C:\Windows\SysWOW64\WindowsPowerShell\v1.0

В зависимости от того, какую версию PS вы используете Если файлов нет, создайте их

В любом C:\Windows\System32\WindowsPowerShell\v1.0 Или C:\Windows\SysWOW64\WindowsPowerShell\v1.0

В зависимости от какой версии PS вы используете

Если файлов конфигурации нет, создайте их

powershell.exe.config:

<configuration>  
    <startup useLegacyV2RuntimeActivationPolicy="true">  
        <supportedRuntime version="v4.0.30319"/>  
        <supportedRuntime version="v2.0.50727"/>  
    </startup>  
</configuration>  

powershell_ise.exe.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <startup>
      <supportedRuntime version="v4.0.30319" />
    </startup>
</configuration>

Чтобы иметь возможность запускать сценарии PowerShell, входящие в пакет NuGet, выполнение политика должна быть изменена:

Set-ExecutionPolicy RemoteSigned -Scope Process

Скопируйте install.ps1, который вы хотите отлаживать и изменять его содержимое следующим образом:

удалить блок параметров

param(
    [Parameter(Mandatory=$true)] [string]   $installPath,
    [Parameter(Mandatory=$true)] [string]   $toolsPath,
    [Parameter(Mandatory=$true)]            $package,
    [Parameter(Mandatory=$true)]            $project
)

импортировать модуль, который позволяет использовать командлеты nuget вне хост-процесса VS

Загрузить http://community.sharpdevelop.net/blogs/mattward/NuGet/NuGetOutsideVisualStudio.zip  Извлеките содержимое папки bin в какое-то место, а затем импортируйте PackageManagement.Cmdlets.dll

так:

import-module "C:\dev\NuGetOutsideVisualStudio\bin\PackageManagement.Cmdlets.dll"

теперь вы можете вручную установить все параметры:

$toolsPath="C:\dev\demo-solution\packages\X1.Registration.DbUpdate.0.4\tools"
$installPath="C:\dev\demo-solution\packages\X1.Registration.DbUpdate.0.4"

set-project DemoSolution.Logic C:\dev\demo-solution\DemoSolution.sln

$project = Get-Project -name DemoSolution.Logic

Это все еще оставляет объект пакета $package unset, но я обнаружил, что script на самом деле не ссылается на этот параметр

Литература: http://community.sharpdevelop.net/blogs/mattward/archive/2011/06/12/InstallingNuGetPackagesOutsideVisualStudio.aspx

Ответ 3

Используйте Set-PsDebug -trace 2, чтобы увидеть, что происходит.

Ответ 4

Запустите свои скрипты через консоль диспетчера пакетов в VS (подробности на консоли https://docs.nuget.org/ndocs/tools/package-manager-console) - и все, что вызывает ошибку по пути будут выписаны красным цветом.

Кроме того, вы можете написать диагностическую информацию о типе трассировки с помощью Write-Host на той же консоли.

Ответ 5

Вы можете вызвать Start-Transcript в начале установки script и Stop-Transcript в конце. Вы, вероятно, обернете установочный код следующим образом:

try {
  $ErrorActionPreference = 'stop'  # stop on error
  Start-Transcript c:\a.txt
  ...
}
catch {
  write-host $_
}
finally {
  Stop-Transcript
}

Также возможно работать $ErrorActionPreference = 'inquire' (вместо остановки). Тем не менее, нет никакой возможности попробовать это сейчас. См. http://tasteofpowershell.blogspot.com/2008/07/handling-errors-in-powershell.html