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

Custom TFS Check-In Policy in Visual Studio 2017

不久前,我开发了一个自定义 TFS 签入策略,在 Visual Studio 2015 上运行良好。 现在我安装了 Visual Studio 2017 并想像我之前使用 VS2015 一样注册签入策略程序集。但这不起作用。 如何使用 VS2017 注册自定义签入策略程序集?

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

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

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

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

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

但不幸的是这不起作用:

当然,我在更改注册表后重新启动了IDE,但即使rebooting我的机器也没有帮助。

我目前发现的 information 似乎 表明签入政策现在必须是扩展程序 (vsix) 的一部分,而我不这样做想相信。


我猜问题出在程序集加载到 IDE.

时无法解析的一些引用

MyCheckInPolicy 项目从 VS2015 文件夹 C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer.
引用 Microsoft.TeamFoundation.VersionControl.Client.dll v14.0 我试图从 VS2017 文件夹中引用相应的 dll,但是程序集在 both IDEs.

中不起作用

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

我们正在使用 TFS 12.0.30723.0.


1所以好像VS2017甚至不尝试加载程序集也不关心注册表项?

在 Visual Studio 2017 年有 breaking changes 可扩展性。许多注册表配置已移至 "private" 注册表:

To reduce the impact on the registry, Visual Studio now uses the RegLoadAppKey function to store registry keys in a private binary file under %VsAppDataFolder%\privateregistry.bin. Only a very small number of Visual Studio-specific keys remain in the system registry. (link)

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

因此,以下是我为使我们的策略在 VS 2017 中正常运行所经历的步骤:

  1. 安装 Visual Studio SDK(如果您最初没有 select 工作量,可以通过 modifying 安装完成)。
  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
        • 当前解决方案中的项目
        • 项目:Select 您的签入政策项目
      • Microsoft.VisualStudio.VsPackage
        • 文件系统上的文件
        • 路径:Select 来自第 3 步的 .pkgdef 文件。
    3. 先决条件:Visual Studio core editor [15.0,16.0)
  5. 构建 VSIX 项目和 distribute/install 生成的 vsix

This GitHub 存储库有助于将所有内容拼凑在一起。我在迁移到 vsix 时发现的一些怪癖:

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

将此密钥添加到 HKCU 对我有用:

HKEY_CURRENT_USER\SOFTWARE\Microsoft\VisualStudio.0\TeamFoundation\SourceControl\Checkin Policies

希望对您有所帮助。 谢谢, 威尔萨德