43 votes

Comment déboguer install.ps1 script du paquet NuGet

Nous pouvons donc inclure un script powershell d'installation/désinstallation dans un paquet NuGet. J'ai essayé, mais mon install.ps1 ne fonctionne pas. Y a-t-il une possibilité de savoir pourquoi ? Débogage, journalisation, quelque chose ?

Mise à jour

Veuillez noter que le script est exécuté dans le cadre d'un processus d'installation du paquet Nuget. Il peut être très spécifique à Nuget.

27voto

Roman Kuzmin Points 13913

Je suis peut-être en retard, mais voici une solution pour déboguer les scripts spécifiques à NuGet, le paquet NuGet. NuGetDebugTools . Son script Add-Debugger.ps1 ajoute un débogueur simple et pourtant efficace à la console du gestionnaire de paquets NuGet.

Le scénario type :

  • lancer Visual Studio
  • Ouvrez la console NuGet et tapez les commandes

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

(ou définir des points d'arrêt plus spécifiques, voir help Set-PSBreakpoint )

  • ouvrir une solution Visual Studio ou invoquer Install-Package XYZ pour une solution déjà ouverte.

  • le dialogue d'entrée du débogueur apparaît sur n'importe quel init.ps1 y install.ps1 invoqué

  • tapez ? comme entrée du débogueur et voyez ce que vous pouvez faire :

    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.
  • tapez d'autres commandes du débogueur et de PowerShell et observez les résultats dans la console NuGet.


v1.4.0 - Nouvel interrupteur ReadHost indique qu'il faut utiliser Read-Host pour la saisie au lieu de la boîte de saisie par défaut de l'interface graphique.

8voto

ambidexterous Points 139

Voici comment j'ai pu passer en revue le fichier install.ps1 en utilisant PowerShell ISE :

Pour pouvoir suivre l'exécution de l'installation du script en utilisant PowerShell ISE, suivez ces étapes : Activer l'exécution des assemblages construits avec .Net 4

Soit

C:\Windows\System32\WindowsPowerShell\v1.0 Ou

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

En fonction de la version de PS que vous utilisez Si les fichiers ne sont pas là, créez-les

Soit C:\Windows\System32\WindowsPowerShell\v1.0 Ou C:\Windows\SysWOW64\WindowsPowerShell\v1.0

En fonction de la version de PS que vous utilisez

Si les fichiers de configuration ne sont pas présents, créez-les

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>

Pour pouvoir exécuter les scripts PowerShell inclus dans un paquet NuGet, la politique d'exécution doit d'exécution devra être modifiée :

Set-ExecutionPolicy RemoteSigned -Scope Process (Politique d'exécution à distance)

Copiez le fichier install.ps1 que vous voulez déboguer et modifiez son contenu comme suit :

supprimer le bloc de paramètres

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

importer un module qui permet d'utiliser les cmdlets nuget en dehors du processus hôte VS

Télécharger http://community.sharpdevelop.net/blogs/mattward/NuGet/NuGetOutsideVisualStudio.zip Extrayez le contenu du dossier bin vers un endroit quelconque, puis importez PackageManagement.Cmdlets.dll.

comme ça :

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

Vous pouvez maintenant régler tous les paramètres manuellement comme suit :

$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

Cela laisse toujours l'objet $package non défini mais j'ai trouvé que script ne fait pas vraiment référence à ce paramètre

Références : http://community.sharpdevelop.net/blogs/mattward/archive/2011/06/12/InstallingNuGetPackagesOutsideVisualStudio.aspx

4voto

manojlds Points 96599

Utilice Set-PsDebug -trace 2 pour voir ce qui se passe.

4voto

Ethan J. Brown Points 1285

Exécutez vos scripts via la console du gestionnaire de paquets dans VS (détails sur la console à l'adresse https://docs.nuget.org/ndocs/tools/package-manager-console ) - et tout ce qui provoque une erreur en cours de route sera écrit en rouge.

Vous pouvez également écrire des informations de type trace de diagnostic avec Write-Host sur la même console.

1voto

stej Points 14257

Vous pouvez appeler Start-Transcript au début de l'installation script et Stop-Transcript à la fin. Vous devriez probablement envelopper le code d'installation comme ceci :

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

Aussi $ErrorActionPreference = 'inquire' (au lieu de stop) pourrait éventuellement fonctionner. Cependant, je n'ai pas la possibilité de l'essayer maintenant. Voir http://tasteofpowershell.blogspot.com/2008/07/handling-errors-in-powershell.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X