我一直在关注如何构建一个将添加一些自定义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>
文件结构
答案 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'目录下。