vs调试nuget包,关于C#:如何调试NuGet包的install.ps1脚本

因此,我们可以在NuGet软件包中包括安装/卸载powershell脚本。 我试过了,但是我的install.ps1无法正常工作。 是否有可能找出原因? 调试,记录什么?

更新

请注意,该脚本是在Nuget软件包安装过程中执行的。 它可能是特定于Nuget的。

也许我来晚了,但是这里是调试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).

    Show debug location in context of lines.

+    Set location context preference to lines.

   Invoke any PowerShell and write its output.

键入其他调试器和PowerShell命令,并在NuGet控制台中查看输出

v1.4.0-新开关ReadHost指示使用Read-Host代替默认的GUI输入框进行输入。

我尝试了此cmdline调试器,事实证明它很棒!强烈推荐。

有什么方法可以不获取消息框,而是在控制台中键入命令?除了烦恼之外,这些脚本还很棒。

是。在Add-Debugger之后,您可以定义自己的全局函数Read-Debugger。例如,尝试非常简单的方法:function Read-Debugger($prompt) { Read-Host $prompt }。默认情况下不会执行此操作,因为:a)该工具适用于任何主机,某些主机未实现Read-Host; b)即使实施了Read-Host,也可能会出现一些问题。使用的对话框很愚蠢,但是它总是可以正常工作,并且没有"烦恼"的问题。

v1.4.0-新开关ReadHost指示使用Read-Host代替默认的GUI输入框进行输入。

对不起,在手机上书写时,我有时有时会显得过于简洁,但并没有如我所愿。问题在于消息框意味着我必须将注意力分散在消息框和控制台窗口之间,并且始终存在焦点问题。现在太好了,谢谢您的工作!

很抱歉,但是我发现Ive在网上阅读的每个部分的NuGet文档都很稀缺!我的意思是,它不是非常友好。在尝试完成简单的任务时,我发现许多令人沮丧的时间。我已经通过程序包管理器控制台安装了NuGetDebugTools。然后,我尝试输入:Add-Debugger,但我收到此错误消息:The term Add-Debugger is not recognized as the name of a cmdlet, function, script file, or operable program.

我不知道为什么会这样。无论如何,您都不必安装软件包。只需使用脚本即可。要么将其放置在路径中包含的目录中,要么使用包含的路径(即path\Add-Debugger.ps1)调用它。

添加调试器失败。我得到的与QuantumHive相同。我必须运行"。 packages nuGetDebugTools.1.4.1 tools Add-Debugger.ps1",但要使用完整的路径。

@Rhyous如果它与完整路径一起使用,则脚本没有问题。 NuGet可能更改了某些内容。

我现在在VS2015中已经尝试过了,并且有效。

顺便说一句,为什么您要运行"。 packages nuGetDebugTools.1.4.1 tools Add-Debugger.ps1"?您应该只运行" Add-Debugger.ps1"。

因为当我在没有完整路径的情况下运行Add-Debugger.ps1时,它由于无法识别的cmd-let而失败。

如果您想在我的帮助下解决此问题,请在项目站点上提交该问题的详细信息。它在VS2015和我的NuGet安装中对我来说很好用。大概是您的设置不太正确。

这就是我使用PowerShell ISE逐步执行install.ps1的方式:

为了能够使用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:

powershell_ise.exe.config:

为了能够运行NuGet软件包随附的PowerShell脚本

政策将需要更改:

Set-ExecutionPolicy RemoteSigned-范围过程

复制要调试的install.ps1并修改其内容,如下所示:

删除参数块

param(

[Parameter(Mandatory=$true)] [string]   $installPath,

[Parameter(Mandatory=$true)] [string]   $toolsPath,

[Parameter(Mandatory=$true)]            $package,

[Parameter(Mandatory=$true)]            $project

)

导入一个模块,该模块允许在VS主机进程之外使用nuget cmdlet

下载http://community.sharpdevelop.net/blogs/mattward/NuGet/NuGetOutsideVisualStudio.zip

将bin文件夹的内容提取到某个位置,然后导入PackageManagement.Cmdlets.dll

像这样:

import-module"C:\dev

uGetOutsideVisualStudio\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

通过VS中的Package Manager控制台运行脚本(该控制台的详细信息,位于https://docs.nuget.org/ndocs/tools/package-manager-console)-并将在此过程中引起任何错误。红色。

另外,您可以使用Write-Host将诊断跟踪类型信息写入同一控制台。

通过程序包管理器控制台运行脚本是什么意思?

@tofutim我在软件包管理器控制台上添加了指向信息的链接

使用Set-PsDebug -trace 2查看正在发生的事情。

什么也没做。它可能是特定于Nuget的。

@dkl-我将尝试并更新

当我尝试调试Powershell程序包中的cmdlet时,这对我有用。

也可以在VS的Package Manager控制台中使用

您可以在安装脚本的开头调用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

NuGet软件包不允许这样做:"安装失败。回滚...此主机不支持转录。"

仅控制台主机支持转录。