Visual studio 2012 带有项目模板和NuGet包的VSIX

Visual studio 2012 带有项目模板和NuGet包的VSIX,visual-studio-2012,nuget,vsix,Visual Studio 2012,Nuget,Vsix,我一直在关注这篇关于如何构建将添加一些自定义MVC项目类型的VSIX项目的文章: 我还想包括一些额外的Nuget软件包,所以我一直在关注,但它似乎是针对VS2010的,我正在2012年工作 我有项目大楼,在我的机器上一切都运转良好。安装工作,新的项目类型出现,当我创建一个这种类型的新项目时,一切都很好 然而,当我将安装程序发送给同事时,情况就不一样了。安装程序工作时,他们会看到新的项目类型,但在创建项目时,他会收到错误消息,说明无法在扩展节点中安装任何软件包。我已经确认了扩展名的产品Id是正确

我一直在关注这篇关于如何构建将添加一些自定义MVC项目类型的VSIX项目的文章:

我还想包括一些额外的Nuget软件包,所以我一直在关注,但它似乎是针对VS2010的,我正在2012年工作

我有项目大楼,在我的机器上一切都运转良好。安装工作,新的项目类型出现,当我创建一个这种类型的新项目时,一切都很好

然而,当我将安装程序发送给同事时,情况就不一样了。安装程序工作时,他们会看到新的项目类型,但在创建项目时,他会收到错误消息,说明无法在扩展节点中安装任何软件包。我已经确认了扩展名的产品Id是正确的(我在测试期间故意在.vstemplate文件中对其进行了错误格式化,它给出了一个完全不同的错误)。我已经将包添加到扩展清单中,但似乎没有什么不同。我还确认已将.nupkg文件部署到%ProgramFiles(x86)%\Microsoft Visual Studio 11.0\Common7\IDE\Extensions

有什么建议吗

自定义项目的.vstemplate部分


NuGet.VisualStudio.Interop,版本=1.0.0.0,区域性=中性,PublicKeyToken=b03f5f7f11d50a3a
NuGet.VisualStudio.TemplateWizard
source.extension.vsixmanifest资产标签


文件结构

  • 扩建工程
    • 包裹
      • NuGetPackage1
      • NugetPackage2
    • 项目模板
      • 自定义MVCTemplate
    • source.extension.vsixmanifest
查看这个帮助我的链接。但是,我仍然遇到一个问题,我的所有引用路径都是空的

请特别注意上面链接的文章中的以下评论:

我花了相当长的时间试图弄清楚什么是与CustomExtension相对应的v2,但长话短说,您不需要对.vsixmanifest进行任何更改—只需将VSIX中的所有包都包含在“packages”目录下即可


我已经制作了一个关于如何制作自动下载nuget软件包的VSIX的逐步视频


因为有很多步骤,我从来没有写下来,所以我不会在这里键入它们。我肯定已经在其他人的机器上测试过我的VSIX软件包,希望它能对您起作用。

要下载最新版本的NuGet软件包及其所有依赖项,请在您的VSIX中添加以下类:

public class MyProjectWizard : IWizard
{
    IEnumerable<string> _packages;

    public void RunStarted(object automationObject, Dictionary<string, string> replacementsDictionary, WizardRunKind runKind, object[] customParams)
    {
        if (customParams.Length > 0) {
            var vstemplate = XDocument.Load((string)customParams[0]);
            _packages = vstemplate.Root
                .ElementsNoNamespace("WizardData")
                .ElementsNoNamespace("packages")
                .ElementsNoNamespace("package")
                .Select(e => e.Attribute("id").Value)
                .ToList();
        }
    }

    public void ProjectFinishedGenerating(Project project)
    {
        var componentModel = (IComponentModel)Package.GetGlobalService(typeof(SComponentModel));
        var _installer = componentModel.GetService<IVsPackageInstaller2>();

        foreach (var package in _packages) {
            _installer.InstallLatestPackage(null, project, package, false, false);
        }
    }
}
公共类MyProjectWizard:IWizard
{
IEnumerable\u包;
public void RunStarted(对象自动对象、字典替换Dictionary、向导runKind runKind、对象[]customParams)
{
如果(customParams.Length>0){
var vstemplate=XDocument.Load((字符串)customParams[0]);
_packages=vstemplate.Root
.ElementsNoNamespace(“向导数据”)
.ElementsNoNamespace(“包”)
.ElementsNoNamespace(“包”)
.Select(e=>e.Attribute(“id”).Value)
.ToList();
}
}
公共无效项目完成生成(项目)
{
var componentModel=(IComponentModel)Package.GetGlobalService(typeof(scocomponentmodel));
var_installer=componentModel.GetService();
foreach(var包在_包中){
_installer.InstalllatesPackage(null、project、package、false、false);
}
}
}
然后在vstemplate中使用以下内容:

  <WizardExtension>
    <Assembly>MyProjectWizard, Version=1.0.0.0, Culture=neutral, PublicKeyToken=22c2a1a5fa7b6905</Assembly>
    <FullClassName>MyProjectWizard.MyProjectWizard</FullClassName>
  </WizardExtension>

MyProjectWizard,版本=1.0.0.0,区域性=中性,PublicKeyToken=22c2a1a5fa7b6905
MyProjectWizard.MyProjectWizard

对于那些只对相关部分感兴趣的人来说,很遗憾,它从一开始就没有下载。通过这种方式,如果已经下载了包,则只需将包添加到项目中。非常好的查找。我也在你的答案中直接添加了关键段落。包定义在哪里?从此行开始:(IComponentModel)Package.GetGlobalService(typeof(scoComponentModel));以上问题的答案是:使用Microsoft.VisualStudio.Shell;程序集:Microsoft.VisualStudio.Shell.15.0.dll