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

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

Обновить

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


person dkl    schedule 11.08.2011    source источник


Ответы (5)


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

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

  • запустить визуальную студию
  • откройте консоль 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 для ввода вместо поля ввода графического интерфейса по умолчанию.

person Roman Kuzmin    schedule 08.02.2014
comment
Я попробовал этот командный отладчик, который оказался замечательным! Настоятельно рекомендуется. - person Dodd; 18.07.2014
comment
Есть ли способ не получить окно сообщения, а вместо этого вводить команды в консоль? Помимо этого раздражения, эти сценарии великолепны. - person Voo; 19.06.2015
comment
да. После Add-Debugger вы можете определить свою собственную глобальную функцию Read-Debugger. Например, попробуйте это очень просто: function Read-Debugger($prompt) { Read-Host $prompt }. По умолчанию это не делается, потому что: а) инструмент для любого хоста, некоторые хосты не реализуют Read-Host; б) даже при реализации Read-Host возможны некоторые проблемы. Используемое диалоговое окно глупое, но оно просто работает, всегда и без проблем, кроме раздражения. - person Roman Kuzmin; 19.06.2015
comment
v1.4.0 — новый переключатель ReadHost указывает использовать Read-Host для ввода вместо поля ввода графического интерфейса по умолчанию. - person Roman Kuzmin; 20.06.2015
comment
Извините, когда пишу с телефона, я иногда слишком краток, это не получилось так, как я хотел. Проблема только в том, что окно сообщения означает, что я должен разделить свое внимание между окном сообщения и окном консоли, и всегда есть проблема с фокусом. Сейчас просто супер, спасибо за вашу работу! - person Voo; 22.06.2015
comment
Извините, но я обнаружил, что документация NuGet из каждой части, которую я читал в сети, очень скудна! Под этим я подразумеваю, что это не очень удобно для нубов. Я нахожу много разочаровывающих часов, пытаясь выполнить простые задачи. Я установил NuGetDebugTools через консоль диспетчера пакетов. Затем я пытаюсь ввести: Add-Debugger, но получаю сообщение об ошибке: The term 'Add-Debugger' is not recognized as the name of a cmdlet, function, script file, or operable program. - person QuantumHive; 16.03.2016
comment
Я не знаю, почему это происходит. В любом случае, вам не нужно устанавливать пакет. Просто используйте скрипт. Либо поместите его в каталог, включенный в путь, либо вызовите его с включенным путем, то есть path\Add-Debugger.ps1. - person Roman Kuzmin; 16.03.2016
comment
Add-Debugger не работает. Я получаю то же самое, что и QuantumHive. Мне пришлось запустить .\packages\NuGetDebugTools.1.4.1\tools\Add-Debugger.ps1, но с полным путем это сработало. - person Rhyous; 28.04.2016
comment
@Rhyous Если это сработало с полным путем, то со сценарием проблем нет. Вероятно, NuGet что-то изменил. - person Roman Kuzmin; 28.04.2016
comment
Я попробовал это прямо сейчас в VS2015, и это сработало. - person Roman Kuzmin; 28.04.2016
comment
Кстати, почему вы запускаете .\packages\NuGetDebugTools.1.4.1\tools\Add-Debugger.ps1? Вы должны просто запустить Add-Debugger.ps1. - person Roman Kuzmin; 28.04.2016
comment
Потому что, когда я запускаю Add-Debugger.ps1 без полного пути, он завершается сбоем как нераспознанный cmd-let. - person Rhyous; 28.04.2016
comment
Если вы хотите решить эту проблему с моей помощью, отправьте заявку на сайте проекта с более подробной информацией. У меня это отлично работает в VS2015 и моей установке NuGet. Что-то не так с вашей настройкой, предположительно. - person Roman Kuzmin; 29.04.2016

Вот как я смог пройти через 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 -Scope

Скопируйте 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

person ambidexterous    schedule 21.12.2011

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

person manojlds    schedule 11.08.2011
comment
Ничего не делает. Это может быть специфично для Nuget. - person dkl; 12.08.2011
comment
Это сработало для меня, когда я пытался отладить командлеты в пакете powershell. - person Simon Gill; 04.10.2011

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

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

person Ethan J. Brown    schedule 03.02.2012
comment
что вы подразумеваете под «запускать свои сценарии» через консоль диспетчера пакетов? - person tofutim; 13.07.2016
comment
@tofutim Я добавил ссылку на информацию в консоли диспетчера пакетов - person Ethan J. Brown; 25.09.2016

Вы можете вызвать 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

person stej    schedule 11.08.2011
comment
Это не разрешено для пакетов NuGet: установка не удалась. Откат... Этот хост не поддерживает транскрипцию. - person dkl; 12.08.2011
comment
Только хост консоли поддерживает транскрипцию. - person x0n; 21.12.2011