【问题标题】:PowerShell script to auto-add Visual Studio "External Tools..." menu options?PowerShell脚本自动添加Visual Studio“外部工具...”菜单选项?
【发布时间】:2014-02-15 21:11:39
【问题描述】:

我们使用 Nuget 来管理我们的内部工具链并安装一些 PowerShell 脚本,我们目前通过自定义“外部工具...”菜单选项手动将其包含在 Visual Studio 中。

如果有一个 PowerShell 脚本可以自动添加通常需要“外部工具...”对话框的菜单选项,我会喜欢它。是否有 API 可以做到这一点?

我已经编写了大部分 Dev On-boarding 流程以自动配置开发机器,除了像这样的一些奇怪的东西。

任何想法表示赞赏。

【问题讨论】:

    标签: visual-studio powershell visual-studio-2013 nuget


    【解决方案1】:

    这是可能的。

    在可以访问 DTE 对象的 NuGet 包的 init.ps1 文件中,可以从包含用户设置配置的动态创建的文件中导入新工具,然后在导入用户设置后将其删除。

    这是一个执行导入的命令示例。该示例启动 Powershell,执行项目根目录中的脚本。请注意,我使用 VS v9.0 以获得最大的向后兼容性,但可以只导出 v15.0(或更高版本)中的现有工具菜单配置,并相应地替换下面文件中的内容。

    init.ps1 文件内容

    # NuGet Package installation script. Run 
    # first time NuGet package installed to solution. 
    param($installPath, $toolsPath, $package, $project)
    
    # Determine fully qualified path to a temp file
    $fileName = [System.IO.Path]::GetTempPath() + [System.Guid]::NewGuid().ToString() + ".vssettings"; 
    
    # Create User Settings file:
    '<UserSettings>
        <ApplicationIdentity version="9.0"/>
        <ToolsOptions/>
        <Category name="Environment_Group" RegisteredName="Environment_Group">
            <Category name="Environment_ExternalTools" Category="{E8FAE9E8-FBA2-4474-B134-AB0FFCFB291D}" Package="{DA9FB551-C724-11d0-AE1F-00A0C90FFFC3}" RegisteredName="Environment_ExternalTools" PackageName="Visual Studio Environment Package">
                <PropertyValue name="Launch Powershell.Command">powershell.exe</PropertyValue>
                <PropertyValue name="Launch Powershell.Arguments">"&amp; ''$(ProjectDir)\Myscript.ps1''"</PropertyValue>
                <PropertyValue name="Launch Powershell.InitialDirectory">"$(ProjectDir)"</PropertyValue>
                <PropertyValue name="Launch Powershell.SourceKeyName"/>
                <PropertyValue name="Launch Powershell.UseOutputWindow">true</PropertyValue>
                <PropertyValue name="Launch Powershell.PromptForArguments">false</PropertyValue>
                <PropertyValue name="Launch Powershell.CloseOnExit">true</PropertyValue>
                <PropertyValue name="Launch Powershell.IsGUIapp">false</PropertyValue>
                <PropertyValue name="Launch Powershell.SaveAllDocs">true</PropertyValue>
                <PropertyValue name="Launch Powershell.UseTaskList">false</PropertyValue>
                <PropertyValue name="Launch Powershell.Unicode">false</PropertyValue>
                <PropertyValue name="Launch Powershell.Package">{00000000-0000-0000-0000-000000000000}</PropertyValue>
                <PropertyValue name="Launch Powershell.NameID">0</PropertyValue>
                <PropertyValue name="ToolNames">Launch Powershell</PropertyValue>
            </Category>
        </Category>
    </UserSettings>' >> $fileName
    
    
    # Perform the import of the custom tool
    $project.DTE.ExecuteCommand("Tools.ImportandExportSettings", "/import:""$fileName""");
    
    "--Remove file"
    Remove-Item -path $fileName
    

    MyProject.nuspec(部分)内容

    .nuspec 文件中,确保包含init.ps1 文件。在下面的例子中,init.ps1 的源代码位于“Scripts”文件夹中名为“MyProject”的 Visual Studio 项目中。

    <?xml version="1.0" encoding="utf-8"?>
    <package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
        <metadata>
          ...
        </metadata>
        <files>
            ...
            <!-- NuGet Package installation script. Run first time NuGet package installed to solution. -->
            <file src="Scripts\init.ps1" target="tools\init.ps1" />
        </files>
    </package>
    

    【讨论】:

    • 这可能是对 StackOverflow 最惊人的贡献......先生,你值得一顶帽子。
    • @JohnZabroski 谢谢约翰。在其他链接和关于 SO 的建议的帮助下,我实现了类似的事情。但是,我想得越多,我就越认为这不是最好的方法……就像第一次安装项目时,脚本会运行,但是对于其他开发人员来说,拉动项目从源代码控制,我认为脚本不会运行。使用 InnoSetup 创建一个简单的安装程序可能更合适,该安装程序运行相同的 powershell 脚本(在上面的答案中)来执行此操作。那么外部工具的安装与安装 Nuget 包无关......
    • 我考虑了您的评论,我想我唯一的问题是,使用 NuGet 包与通过 NuGet 安装的 xunit.runner 有何不同?
    • @JohnZabroski 他们是一样的。我的建议是 /not/ 使用 NuGet 安装外部工具菜单项,因为工具菜单上的选项不应绑定到单个项目。此外,对于较新版本的 NuGet,任何 Powershell 脚本仅在第一次安装包时安装(因此,如果它已经存在,例如在将包签入源代码管理时),那么添加菜单的脚本将永远不会运行.我建议使用非 NuGet 方法来安装菜单项...
    • NuGet 人在包管理方面的糟糕想法总是让我惊叹不已。我不知道那个 PowerShell 脚本规则。肯定有办法克服这种疯狂的行为吗? Paket 可能是从这里开始的方式。甚至 NuGet.org 现在也将 Paket 识别为安装 nupkg 的选项
    【解决方案2】:

    我正在寻找同样的东西,到目前为止,似乎没有办法从 PowerShell 与 IDE 进行交互。但是我发现了这个包http://www.nuget.org/packages/StudioShell.Provider/,乍一看,它允许你做一些只有插件和扩展才能做的高级事情。但在我看来,这个问题有点矫枉过正。

    【讨论】:

    • 我不久前找到了一种可能的方法,但我还没有尝试过。基本上,(1)工具->导入和导出设置...(2)导出环境设置,接下来,所有设置->常规设置->外部工具列表试一试,让我知道它是否有效......
    猜你喜欢
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多