Visual Studio 2017中的自定义TFS签入策略

不久之前,我开发了一个自定义的TFS签到策略,该策略在Visual Studio 2015中运行良好 。 现在我安装了Visual Studio 2017,并希望以与之前使用VS2015相同的方式注册签入策略程序集。 但这不起作用。 如何在VS2017中注册自定义签到策略程序集?

对于VS2015,我有这些注册表项:

[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\14.0\TeamFoundation\SourceControl\Checkin Policies] "MyCheckInPolicy"="C:\\Program Files\\My\\MyCheckInPolicy.dll" 

 [HKEY_CURRENT_USER\SOFTWARE\Microsoft\VisualStudio\14.0_Config\TeamFoundation\SourceControl\Checkin Policies] "MyCheckInPolicy"="C:\\Program Files\\My\\MyCheckInPolicy.dll" 

因此我为VS2017( 15.0 )添加了这些键:

 [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\15.0\TeamFoundation\SourceControl\Checkin Policies] "MyCheckInPolicy"="C:\\Program Files\\My\\MyCheckInPolicy.dll" [HKEY_CURRENT_USER\SOFTWARE\Microsoft\VisualStudio\15.0_Config\TeamFoundation\SourceControl\Checkin Policies] "MyCheckInPolicy"="C:\\Program Files\\My\\MyCheckInPolicy.dll" 

但不幸的是,这不起作用:

  • 如果我打开Team Project SourceControl设置,请转到“签入策略”选项卡并尝试添加...策略, MyCheckInPolicy 不会出现 1
  • 如果我打开已使用此签入策略的团队项目并执行上述操作,则会收到一条错误消息,告诉我程序集( mycheckinpolicy )“尚未注册”。

当然,我在注册表更改后重新启动了IDE,但即使重新启动我的机器也无济于事。

到目前为止我发现的信息 似乎表明,登记政策现在必须是扩展(vsix)的一部分,我不想相信。


我猜这个问题来自于一些在程序集加载到IDE时无法解析的引用。

MyCheckInPolicy项目从VS2015文件夹C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer
我试图从VS2017文件夹中引用相应的dll,但随后程序集在两个 IDE中不起作用。

我还尝试使用Nuget包“Microsoft.TeamFoundation.VersionControl.All”v12.0.30723.2,并将输出目录中的所有文件(似乎包含包的所有程序集)部署到注册表项中提到的位置。 这具有相同的结果:无法在VS2015和VS2017中加载策略。

我们正在使用TFS 12.0.30723.0


1所以看起来VS2017甚至没有尝试加载程序集而不关心注册表项?

在Visual Studio 2017中,对可扩展性进行了重大更改 。 许多注册表配置已移至“私有”注册表:

为了减少对注册表的影响,Visual Studio现在使用RegLoadAppKey函数将注册表项存储在%VsAppDataFolder%\ privateregistry.bin下的专用二进制文件中。 只有极少数Visual Studio特定的密钥保留在系统注册表中。 ( 链接 )

通过将注册表项定义为vsix中的.pkgdef文件的一部分,在安装时,VS 2017将(我假设)将密钥写入私有注册表而不是实际的注册表,这是以前版本的VS中的情况。 这将允许政策被拿起。

因此,以下是我在VS 2017中实施策略的步骤:

  1. 安装Visual Studio SDK(如果您最初未选择工作负载,则可以通过修改安装来完成)。
  2. 将新的VSIX项目添加到签入策略解决方案中
  3. 使用以下命令将.pkgdef文件添加到VSIX项目(这是注册表项条目):

    [$RootKey$\TeamFoundation\SourceControl\Checkin Policies] "YourPolicy"="$PackageFolder$\YourPolicy.dll"

  4. 修改VSIX项目中的source.extension.vsixmanifest(使用GUI向导):

    1. 安装目标:添加支持最低的VS版本:
      • Microsoft.VisualStudio.Community [15.0,16.0)
      • Microsoft.VisualStudio.IntegratedShell [15.0,16.0)
    2. 资产:
      • Microsoft.VisualStudio.Assembly
        • 当前解决方案中的项目
        • 项目:选择您的签到政策项目
      • Microsoft.VisualStudio.VsPackage
        • 文件系统上的文件
        • 路径:从步骤3中选择.pkgdef文件。
    3. 先决条件: Visual Studio core editor [15.0,16.0)
  5. 构建VSIX项目并分发/安装生成的vsix

这个 GitHub回购有助于拼凑所有东西。 迁移到vsix时发现的一些怪癖:

  1. 默认情况下,vsix安装现在是每用户。 如果您在同一台计算机上的多个用户下运行VS,则需要为每个用户安装VS. 在vsixmanifest中有一个选项可以为所有用户安装扩展,但这需要提升。
  2. 我们的签入策略使用了app.config文件,vsix中不支持该文件。 我不得不将我们的设置迁移到.settings文件。

我向HKCU添加了这个密钥:

 HKEY_CURRENT_USER\SOFTWARE\Microsoft\VisualStudio\15.0\TeamFoundation\SourceControl\Checkin Policies 

希望能帮助到你。 谢谢,威尔逊德