使用 Nuget 和 SVN 在内部分发 Visual Studio 模板
Internally distribute a Visual Studio Template using Nuget and SVN
假设我们有一个 Visual Studio 模板,我们想在我们的组织内分发。此模板托管在 SVN 服务器上。我希望用户能够将 Nuget 指向 SVN 位置,并将模板安装在正确的位置,就像任何其他包一样。这可能吗?
Is this possible?
我们可以做,但个人不推荐。
怎么样
根据 NuGet document:
Put simply, a NuGet package is a single ZIP file with the .nupkg
extension that contains compiled code (DLLs), other files related to
that code, and a descriptive manifest that includes information like
the package's version number. Developers with code to share create
packages and publish them to a public or private host. Package
consumers obtain those packages from suitable hosts, add them to their
projects, and then call a package's functionality in their project
code. NuGet itself then handles all of the intermediate details.
但是,Visual Studio模板是一个扩展名为.zip
的文件,NuGet无法识别。即使我们将 NuGet 指向 SVN 位置,NuGet 仍然无法识别它。
要解决此问题,我们必须创建一个 NuGet 程序包以包含此 Visual Studio 模板 .zip
文件,例如:
<files>
<file src="TestDemo.zip" target="Tools\TestDemo.zip" />
</files>
此外,还有一个问题,当我们将这个nuget包安装到项目中时,这个Visual Studio模板.zip
文件会被下载到解决方案文件夹中的\packages
文件夹中.我们必须将其移动到 Visual Studio 模板文件夹。
因此,我们必须在该 nuget 包中添加 .targets
复制任务,以将 zip 文件复制到 Visual Studio 模板文件夹。
.targets
文件的内容:
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="CopyTemplate" BeforeTargets="Build">
<Message Text="Copy Template to template folder."></Message>
<Copy
SourceFiles="$(SolutionDir)packages\MyTemplatePackage.1.0.0\Tools\TestDemo.zip"
DestinationFolder="$(USERPROFILE)\Documents\Visual Studio 2017\Templates\ProjectTemplates"
/>
</Target>
</Project>
最后,.nuspec
文件如下:
<?xml version="1.0"?>
<package >
<metadata>
<id>MyTemplatePackage</id>
<version>1.0.0</version>
<authors>Tester</authors>
<owners>Tester</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>Package description</description>
<releaseNotes>Summary of changes made in this release of the package.</releaseNotes>
<copyright>Copyright 2018</copyright>
<tags>Tag1 Tag2</tags>
</metadata>
<files>
<file src="TestDemo.zip" target="Tools\TestDemo.zip" />
<file src="MyTemplatePackage.targets" target="Build\MyTemplatePackage.targets" />
</files>
</package>
然后打包这个.nuspec文件,将这个nuget包添加到svn位置,将svn位置添加到nuget包源,就可以将这个nuget包安装到项目中,并构建项目,Visual Studio 将下载该 nuget 包并将 .zip
文件复制到 Visual Studio 模板文件夹。
我已经创建了一个示例测试 nuget 包,它在我这边与 Visual Studio 2017 一起工作正常,你可以在 VS2017 上测试它:https://1drv.ms/u/s!Ai1sp_yvodHf2Vax7TzuC6HQUD5w
为什么不推荐
正如您在上面看到的那样,做到这一点并不容易和简单,我们必须做很多事情来创建那个 nuget 包。更重要的是,为了获得模板,我们必须创建一个项目并安装该包并构建项目。它引入了太多额外的操作。此外,当您更改模板中的任何内容时,您必须重新创建此包并安装它。
由于此模板是托管在SVN服务器上的,您可以直接将其查看到Visual Studio模板文件夹中,这样会更有效。
希望这个复杂的答案对您有所帮助。
假设我们有一个 Visual Studio 模板,我们想在我们的组织内分发。此模板托管在 SVN 服务器上。我希望用户能够将 Nuget 指向 SVN 位置,并将模板安装在正确的位置,就像任何其他包一样。这可能吗?
Is this possible?
我们可以做,但个人不推荐。
怎么样
根据 NuGet document:
Put simply, a NuGet package is a single ZIP file with the .nupkg extension that contains compiled code (DLLs), other files related to that code, and a descriptive manifest that includes information like the package's version number. Developers with code to share create packages and publish them to a public or private host. Package consumers obtain those packages from suitable hosts, add them to their projects, and then call a package's functionality in their project code. NuGet itself then handles all of the intermediate details.
但是,Visual Studio模板是一个扩展名为
.zip
的文件,NuGet无法识别。即使我们将 NuGet 指向 SVN 位置,NuGet 仍然无法识别它。要解决此问题,我们必须创建一个 NuGet 程序包以包含此 Visual Studio 模板
.zip
文件,例如:<files> <file src="TestDemo.zip" target="Tools\TestDemo.zip" /> </files>
此外,还有一个问题,当我们将这个nuget包安装到项目中时,这个Visual Studio模板
.zip
文件会被下载到解决方案文件夹中的\packages
文件夹中.我们必须将其移动到 Visual Studio 模板文件夹。因此,我们必须在该 nuget 包中添加
.targets
复制任务,以将 zip 文件复制到 Visual Studio 模板文件夹。.targets
文件的内容:<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Target Name="CopyTemplate" BeforeTargets="Build"> <Message Text="Copy Template to template folder."></Message> <Copy SourceFiles="$(SolutionDir)packages\MyTemplatePackage.1.0.0\Tools\TestDemo.zip" DestinationFolder="$(USERPROFILE)\Documents\Visual Studio 2017\Templates\ProjectTemplates" /> </Target> </Project>
最后,
.nuspec
文件如下:<?xml version="1.0"?> <package > <metadata> <id>MyTemplatePackage</id> <version>1.0.0</version> <authors>Tester</authors> <owners>Tester</owners> <requireLicenseAcceptance>false</requireLicenseAcceptance> <description>Package description</description> <releaseNotes>Summary of changes made in this release of the package.</releaseNotes> <copyright>Copyright 2018</copyright> <tags>Tag1 Tag2</tags> </metadata> <files> <file src="TestDemo.zip" target="Tools\TestDemo.zip" /> <file src="MyTemplatePackage.targets" target="Build\MyTemplatePackage.targets" /> </files> </package>
然后打包这个.nuspec文件,将这个nuget包添加到svn位置,将svn位置添加到nuget包源,就可以将这个nuget包安装到项目中,并构建项目,Visual Studio 将下载该 nuget 包并将
.zip
文件复制到 Visual Studio 模板文件夹。我已经创建了一个示例测试 nuget 包,它在我这边与 Visual Studio 2017 一起工作正常,你可以在 VS2017 上测试它:https://1drv.ms/u/s!Ai1sp_yvodHf2Vax7TzuC6HQUD5w
为什么不推荐
正如您在上面看到的那样,做到这一点并不容易和简单,我们必须做很多事情来创建那个 nuget 包。更重要的是,为了获得模板,我们必须创建一个项目并安装该包并构建项目。它引入了太多额外的操作。此外,当您更改模板中的任何内容时,您必须重新创建此包并安装它。
由于此模板是托管在SVN服务器上的,您可以直接将其查看到Visual Studio模板文件夹中,这样会更有效。
希望这个复杂的答案对您有所帮助。