【问题标题】:Multi project template references broken多项目模板引用损坏
【发布时间】:2016-01-07 08:41:42
【问题描述】:

我正在构建多项目模板。子项目之一是 ASP.NET Web 应用程序。当我将它导出为单个项目模板时,一切都很好,但是当包含在多项目模板中时,几乎一半的引用都被破坏了(Antlr3.Runtime、EntitiFramework、Microsoft.Owin 和许多其他)

多项目模板如下所示:

<VSTemplate Version="3.0.0" Type="ProjectGroup" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
  <TemplateData>
    <Name>Web Api Solution Template</Name>
    <Description>Template commonly used in projects</Description>
    <ProjectType>CSharp</ProjectType>
    <ProjectSubType>
    </ProjectSubType>
    <SortOrder>1000</SortOrder>
    <CreateNewFolder>true</CreateNewFolder>
    <DefaultName>Web_API</DefaultName>
    <ProvideDefaultName>true</ProvideDefaultName>
    <LocationField>Enabled</LocationField>
    <EnableLocationBrowseButton>true</EnableLocationBrowseButton>
    <Icon>IconSolution.png</Icon>
  </TemplateData>
  <TemplateContent>
    <ProjectCollection>
      <ProjectTemplateLink ProjectName="Api">
        Api\MyTemplate.vstemplate
      </ProjectTemplateLink>
      <ProjectTemplateLink ProjectName="BLL">
        BLL\MyTemplate.vstemplate
      </ProjectTemplateLink>
      <ProjectTemplateLink ProjectName="DBModel">
        DBModel\MyTemplate.vstemplate
      </ProjectTemplateLink>
      <ProjectTemplateLink CopyParameters="true" ProjectName="Web">
        Web\MyTemplate.vstemplate
      </ProjectTemplateLink>
    </ProjectCollection>
  </TemplateContent>
</VSTemplate>

为什么会这样?

【问题讨论】:

  • 在 VS 2015 中遇到了完全相同的问题。您有没有找到解决该问题的方法?我认为这与每个项目模板中的 packages.config 文件有关
  • @MichaelTranchida 查看下面的答案
  • 通常您的提示路径已损坏我发现将提示路径更改为更高级别解决了问题

标签: asp.net visual-studio visual-studio-2013 asp.net-web-api


【解决方案1】:

使用模板向导扩展解决了这个问题。基本上我所做的是从子项目中删除所有预安装的 nuget 包并使用向导扩展添加它们,以便 project.vstemplate 的结尾看起来像这样:(在这种情况下为 api)

    <WizardExtension>
    <Assembly>NuGet.VisualStudio.Interop, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</Assembly>
    <FullClassName>NuGet.VisualStudio.TemplateWizard</FullClassName>
  </WizardExtension>
  <WizardData>
    <packages>
  <package id="EntityFramework" version="6.1.1" targetFramework="net45" />
  <package id="Microsoft.AspNet.Identity.Core" version="2.1.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.Identity.EntityFramework" version="2.1.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.Identity.Owin" version="2.1.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.Cors" version="5.2.3" />
  <package id="Microsoft.AspNet.Mvc" version="5.2.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.Razor" version="3.2.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.Web.Optimization" version="1.1.3" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebApi" version="5.2.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebApi.Client" version="5.2.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebApi.Core" version="5.2.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebApi.HelpPage" version="5.2.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebApi.Owin" version="5.2.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebPages" version="3.2.0" targetFramework="net45" />
  <package id="Owin" version="1.0" targetFramework="net45" />
  <package id="Microsoft.Owin" version="3.0.1" targetFramework="net45" />
  <package id="Microsoft.Owin.Cors" version="3.0.1" targetFramework="net45" />
  <package id="Microsoft.Owin.Host.SystemWeb" version="2.1.0" targetFramework="net45" />
  <package id="Microsoft.Owin.Security" version="2.1.0" targetFramework="net45" />
  <package id="Microsoft.Owin.Security.Cookies" version="2.1.0" targetFramework="net45" />
  <package id="Microsoft.Owin.Security.Facebook" version="2.1.0" targetFramework="net45" />
  <package id="Microsoft.Owin.Security.Google" version="2.1.0" targetFramework="net45" />
  <package id="Microsoft.Owin.Security.MicrosoftAccount" version="2.1.0" targetFramework="net45" />
  <package id="Microsoft.Owin.Security.OAuth" version="2.1.0" targetFramework="net45" />
  <package id="Microsoft.Owin.Security.Twitter" version="2.1.0" targetFramework="net45" />
  <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net45" />
  <package id="Newtonsoft.Json" version="6.0.3" targetFramework="net45" />
    </packages>
</WizardData>
</VSTemplate>

据我所知,您可以复制粘贴组装零件,因为它将来不会更改。

【讨论】:

  • 谢谢,看来我需要。我现在正在研究 Sidewaffle,因为它在更改模板和自动更新所有内容方面看起来很有希望。可能想在 Channel 9 / Visual Studio Toolbox 上观看 this video
  • 这几乎解决了我的问题,但为了解决我的问题,需要将属性 repository="template" 添加到标签 &lt;packages&gt; 并将所有必需的 .nupkg 文件添加到项目的根文件夹中。
  • 我刚刚遇到了这个问题。 @JoëlSalamin 当您说项目的“根文件夹”时。这就是所有的“根源”吗?我在一个 sln 中有多个项目。渴望让它发挥作用。
  • @TezWingfield 我在一个解决方案中也有多个项目,您需要在每个需要 NuGet 包的项目中将属性repository="template" 添加到标签&lt;packages&gt;
  • @JoëlSalamin 感谢您的澄清,非常感谢!
【解决方案2】:

使用Sidewaffle。当您修改项目时,无需更新 .vstemplates、nugets 等任何内容。只需重建 .vsix 项目(发布),然后双击发布文件夹中的 .vsix

【讨论】:

    猜你喜欢
    • 2020-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多