Как отладить скрипт install.ps1 пакета NuGet - PullRequest
43 голосов
/ 11 августа 2011

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

Обновление

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

Ответы [ 5 ]

27 голосов
/ 08 февраля 2014

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

8 голосов
/ 21 декабря 2011

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

Чтобы выполнить пошаговое выполнение сценария установки с помощью 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 -Объем процесса

Скопируйте 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 незаданным, но я обнаружил, что скрипт на самом деле не ссылается на этот параметр

Ссылки: http://community.sharpdevelop.net/blogs/mattward/archive/2011/06/12/InstallingNuGetPackagesOutsideVisualStudio.aspx

4 голосов
/ 04 февраля 2012

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

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

4 голосов
/ 12 августа 2011

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

1 голос
/ 12 августа 2011

Вы можете вызвать Start-Transcript в начале сценария установки и 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

...