带有项目模板和NuGet包的VSIX



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

http://www.asp.net/mvc/tutorials/mvc-4/custom-mvc-templates

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

我有项目大楼,在我的机器上一切都很顺利。安装工作正常,出现新的项目类型,当我创建这种类型的新项目时,一切都很完美。

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

有什么建议吗?

自定义项目的.vstemplate部分

<WizardExtension>
    <Assembly>NuGet.VisualStudio.Interop, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</Assembly>
    <FullClassName>NuGet.VisualStudio.TemplateWizard</FullClassName>
</WizardExtension>
<WizardData>
    <packages repository="registry" keyName="AspNetMvc4VS11" isPreunzipped="true">
        <package id="EntityFramework" version="5.0.0" skipAssemblyReferences="true" />
        <package id="jQuery" version="1.8.2" />
        <!-- snip -->
    </packages>
    <packages repository="extension" repositoryId="SampleExtensionId">
      <package id="Unity" version="3.0.1304.0" targetFramework="net45" />
      <package id="Unity.WebAPI" version="0.10" targetFramework="net45" />
      <!-- snip -->
    </packages>
</WizardData>

source.extension.vsixmanifest资产标签

<Assets>
    <Asset d:VsixSubPath="ProjectTemplatesCustomMVCTemplate" etc/>
    <Asset Type="Unity.3.0.1304.0" Path="PackagesUnity.3.0.1304.0.nupkg" />
    <Asset Type="Unity.WebAPI.0.10" Path="PackagesUnity.WebAPI.0.10.nupkg" />
    <!-- snip -->
</Assets>

文件结构

  • 扩建项目
    • 软件包
      • NugetPackage 1
      • NugetPackage 2
      • 等等
    • 项目模板
      • 自定义MVC模板
        • <自定义项目文件>
    • source.extension.vsixmanifest

我制作了一个关于如何制作自动下载nuget包的VSIX的分步视频。

http://www.youtube.com/watch?v=_ZvsFz41H-E

因为有很多步骤,我从来没有写下来,所以我不会在这里键入它们。我肯定在别人的机器上测试过我的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);
        }
    }
}

然后在vstemplate中使用以下内容:

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

查看此链接http://samritchie.net/2012/09/17/nuget-packages-in-vs2012-templates/这对我很有帮助。然而,我仍然遇到这样一个问题,即我所有的引用路径都是空的。

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

我花了相当长的时间试图弄清楚CustomExtension的v2等价物是什么,但长话短说,您不需要对.vsixmanifest进行任何更改——将VSIX中的所有包都包含在"packages"目录下就足够了。

最新更新