5

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

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="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>

文件结构

  • 扩展项目
    • 套餐
      • Nuget包 1
      • NugetPackage 2
      • ETC
    • 项目模板
      • 自定义MVC模板
        • <自定义项目文件>
    • source.extension.vsixmanifest
4

3 回答 3

5

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

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

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

于 2013-08-28T01:12:35.590 回答
3

要下载最新版本的 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>
于 2017-07-30T04:14:22.773 回答
1

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

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

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

于 2013-07-27T00:12:49.633 回答