VSIX与项目模板和NuGet包

时间:2013-07-12 17:23:15

标签: visual-studio-2012 nuget vsix

我一直在关注如何构建一个将添加一些自定义MVC项目类型的VSIX项目的帖子:

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

我还想要包含一些额外的Nuget包,所以我关注this page from Nuget,但它似乎是针对VS2010而且我在2012年工作。

我有项目建设,一切都在我的机器上运行。安装工作,新项目类型出现,当我创建这种类型的新项目时,一切都很完美。

然而,当我将安装程序发送给同事时,事情就会破裂。安装程序工作,他们看到新的项目类型,但在创建项目时,他收到有关无法在扩展节点中安装任何软件包的错误消息。我已经确认扩展的Product 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="ProjectTemplates\CustomMVCTemplate" etc/>
    <Asset Type="Unity.3.0.1304.0" Path="Packages\Unity.3.0.1304.0.nupkg" />
    <Asset Type="Unity.WebAPI.0.10" Path="Packages\Unity.WebAPI.0.10.nupkg" />
    <!-- snip -->
</Assets>

文件结构

  • 扩建项目
      • NugetPackage 1
      • NugetPackage 2
    • ProjectTemplates
      • CustomMVCTemplate
        • &lt;自定义项目文件&gt;
    • source.extension.vsixmanifest

3 个答案:

答案 0 :(得分:4)

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

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

由于有很多步骤,我从未写过,我不会在这里输入。我肯定在其他人的机器上测试了我的VSIX软件包,它确实有用,所以希望这对你有用。

答案 1 :(得分:2)

要下载最新版本的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>

答案 2 :(得分:1)

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

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

  

我花了相当长的一段时间试图找出v2相当于CustomExtension的内容,但总而言之,你不需要对.vsixmanifest进行任何更改 - 它足以包含所有的VSIX中的软件包位于'Packages'目录下。