Добрый день!
Передо мной встала задача создать шаблон c# проекта, в котором есть ссылки на другие библиотеки, а также ссылки на NuGet пакеты. В интернете есть информация с решениями данной задачи, но в них были раскрыты возможные проблемы, из-за которых я не смог легко и просто создать шаблон проекта. Поэтому я решил разместить мануал по решению данной задачи.
Под катом много картинок с пошаговой инструкцией создания шаблона проекта.
1. Выбираем рабочий проект из которого будем создавать шаблон.
Проект называется WorkProject, имеет ссылку на второй проект ToysLibrary и на NuGet пакеты Lucene.Net и ICSharpCode.SharpZipLib.
2. Для создания шаблона проекта, в котором будет ссылка на библиотеку ToysLibrary, создаем каталог Libs в WorkProject и помещаем туда библиотеку ToysLibrary.dll, которую можно найти в bindebug текущего проекта.
3. Ссылку на соседний проект ToysLibrary изменяем, чтобы она указывала на добавленный ToysLibrary.dll файл.
4. Создаем шаблон проекта. File-Export Template…
Снимаем галку автоматического добавления шаблона проекта в Visual Studio, даем наименование шаблона и его описание.
Получаем zip-файл шаблона.
5. Добавляем VSIX проект.
Задаем наименование автора:
6. Распаковываем zip архив, созданный на шаге 4. Изменяем файл MyTemplste.vstemplate. В элемент VSTemplate добавляем следующий текст.
В WizardDatapackages repositoryId вставляем ProdictId из VSIX проекта, созданного на шаге 5.
В WizardDatapackages вставляем пакеты, которые находятся в проекте WorkProjectpackages.config
Текст:
<WizardExtension>
<Assembly>NuGet.VisualStudio.Interop, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</Assembly>
<FullClassName>NuGet.VisualStudio.TemplateWizard</FullClassName>
</WizardExtension>
<WizardData>
<packages repository="extension" repositoryId="VSIXWorkProject.Ilya.7f9929e6-945f-4302-8e54-e19d45ab8ffa">
<package id="Lucene.Net" version="3.0.3" targetFramework="net452" />
<package id="SharpZipLib" version="0.86.0" targetFramework="net452" />
</packages>
</WizardData>
7. Если в Вашем Solution нет папки .nuget, данный пункт можете пропустить. В противном случае необходимо изменить файл WorkProject.csproj. Находим строки:
<Import Project="$(SolutionDir).nugetNuGet.targets" Condition="Exists('$(SolutionDir).nugetNuGet.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('$(SolutionDir).nugetNuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir).nugetNuGet.targets'))" />
</Target>
Удаляем их, т.к. при создании проекта по нашему шаблону, в Solution не будет появляться папка .nuget.
8. Все распакованные файлы на шаге 6, снова архивируем в zip файл.
9. В VSIXWorkProject создаем папку Packages. Добавляем в нее файлы расширения nupkg тех пакетов, на которые ссылался исходный проект WorkProject.
Каждому из добавленных файлов, устанавливаем свойства:
- BuildAction — Content
- CopyToOutputDirectory — CopyAlways
- IncludeInVsix — True
10. В VSIXWorpProject в файле source.extension.vsixmanifest в закладке Metadata изменяем описание.
11. В закладке Assets добавляем новый источник.
Тип – шаблон проекта, источник – файл, путь – указываем путь до zip файла, созданного на шаге 8.
В проект VSIXWorkProject добавился каталог ProjectTemplates с вложенным шаблоном нашего проекта.
12. Перестраиваем проект VSIXWorkProject. В окне Output видим путь до созданного vsix файла.
Запустив данный файл, будет установлен шаблон проекта для VisualStudio.
При создании нового проекта, увидим созданный шаблон.
Надеюсь, что данная статья кому-то будет полезной. Конструктивная критика приветствуется.