2013-07-12 82 views
5

我一直在關注這個帖子關於如何建立一個VSIX項目,將添加一些自定義的MVC項目類型:VSIX與項目模板和的NuGet軟件包

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
    • ProjectTemplates
      • CustomMVCTemplate
        • <定製項目文件>
    • source.extension.vsixmanifest

回答

1

退房此鏈接http://samritchie.net/2012/09/17/nuget-packages-in-vs2012-templates/這幫助了我。但是,我仍然遇到所有參考路徑都爲空的問題。

尤其注意從文章下面的評論上面鏈接:

我花了相當長的時間來嘗試找出什麼V2相當於CustomExtension的是,但削減長話短說,你不不需要對.vsixmanifest進行任何更改 - 只需在'Packages'目錄下包含VSIX中的所有軟件包即可。

+0

優秀的發現。我也將關鍵段落直接添加到您的答案中。 – Olly

4

我已經制作了一個如何製作自動下載nuget軟件包的VSIX的一步一步的視頻。

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

因爲有很多步驟,我從來不寫下來,我不會在這裏輸入。我已經在其他人的機器上測試了我的VSIX軟件包,它的工作原理很有希望,這對你很有用。

+0

對於任何只對相關部分感興趣的人,它始於[22:47](http://www.youtube.com/watch?feature=player_detailpage&v=_ZvsFz41H-E#t=1367) – KyleMit

+3

不幸的是,它不會下載。通過這種方式,如果軟件包已經被下載,軟件包將被添加到項目中。 – hakan

0

要下載的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>