【问题标题】:VSIX with Project Templates and NuGet Packages带有项目模板和 NuGet 包的 VSIX
【发布时间】:2013-07-12 17:23:14
【问题描述】:

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

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

我还想包含一些额外的 Nuget 包,所以我关注了this page from 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="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
    • 项目模板
      • 自定义MVC模板
    • source.extension.vsixmanifest

【问题讨论】:

    标签: visual-studio-2012 nuget vsix


    【解决方案1】:

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

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

    由于步骤很多而且我从来没有写下来,所以我不会在这里输入它们。我确实已经在其他人的机器上测试了我的 VSIX 包,它确实有效,所以希望这对你有用。

    【讨论】:

    • 对于只对相关部分感兴趣的任何人,它从22:47开始
    • 不幸的是它没有下载。通过这种方式,如果已经下载了包,它们就会被添加到项目中。
    【解决方案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>
    

    【讨论】:

    • 包在哪里定义?从这一行开始: (IComponentModel)Package.GetGlobalService(typeof(SComponentModel));
    • 上面的答案是:使用Microsoft.VisualStudio.Shell;程序集:Microsoft.VisualStudio.Shell.15.0.dll
    【解决方案3】:

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

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

    我花了相当长的时间试图找出与 v2 等效的 CustomExtension 是什么,但长话短说,您不需要对 .vsixmanifest 进行任何更改 - 包含所有VSIX 中“Packages”目录下的包。

    【讨论】:

    • 很好的发现。我也直接在您的答案中添加了关键段落。
    猜你喜欢
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多