PowerShell脚本自动添加Visual Studio“外部工具...”菜单选项?

时间:2014-01-24 18:42:55

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

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

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

我已经编写了大部分Dev On-boarding流程来自动配置dev机器,除了这样的一些奇怪之处。

任何想法都赞赏。

2 个答案:

答案 0 :(得分:3)

这是可能的。

在可以访问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>

答案 1 :(得分:0)

我正在寻找相同的东西,到目前为止看起来没有办法如何从PowerShell与IDE交互。但是我找到了这个包http://www.nuget.org/packages/StudioShell.Provider/,乍一看它允许你做高级的东西,你只能使用插件和扩展。但在我看来,这个问题有点过分。