使用 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模板文件夹中,这样会更有效。

希望这个复杂的答案对您有所帮助。