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"
但不幸的是这不起作用:
- 如果我打开 Team Project SourceControl 设置,转到 "Check-in Policy" 选项卡并尝试 添加... 策略,
MyCheckInPolicy
没有出现1
- 如果我打开已经使用此签入策略的团队项目并执行上述操作,我收到一条错误消息,告诉我程序集 (
mycheckinpolicy
) "has not been registered".
当然,我在更改注册表后重新启动了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 中正常运行所经历的步骤:
- 安装 Visual Studio SDK(如果您最初没有 select 工作量,可以通过 modifying 安装完成)。
- 将新的 VSIX 项目 添加到您的签入策略解决方案
使用以下内容(这是注册表项)将 .pkgdef
文件添加到 VSIX 项目:
[$RootKey$\TeamFoundation\SourceControl\Checkin Policies]
"YourPolicy"="$PackageFolder$\YourPolicy.dll"
在 VSIX 项目中修改 source.extension.vsixmanifest
(使用 GUI 向导):
- 安装目标:添加支持的最低 VS 版本:
Microsoft.VisualStudio.Community [15.0,16.0)
Microsoft.VisualStudio.IntegratedShell [15.0,16.0)
- 资产:
- Microsoft.VisualStudio.Assembly
- 当前解决方案中的项目
- 项目:Select 您的签入政策项目
- Microsoft.VisualStudio.VsPackage
- 文件系统上的文件
- 路径:Select 来自第 3 步的 .pkgdef 文件。
- 先决条件:
Visual Studio core editor [15.0,16.0)
- 构建 VSIX 项目和 distribute/install 生成的 vsix
This GitHub 存储库有助于将所有内容拼凑在一起。我在迁移到 vsix 时发现的一些怪癖:
- 默认情况下,vsix 现在是按用户安装的。如果您在同一台机器上的多个用户下操作 VS,则需要为每个用户安装它。 vsixmanifest 中有一个选项可以为所有用户安装扩展,但这需要提升。
- 我们的签入策略使用了 app.config 文件,vsix 不支持该文件。我必须 migrate 我们的设置到
.settings
文件。
将此密钥添加到 HKCU 对我有用:
HKEY_CURRENT_USER\SOFTWARE\Microsoft\VisualStudio.0\TeamFoundation\SourceControl\Checkin Policies
希望对您有所帮助。
谢谢,
威尔萨德
不久前,我开发了一个自定义 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"
但不幸的是这不起作用:
- 如果我打开 Team Project SourceControl 设置,转到 "Check-in Policy" 选项卡并尝试 添加... 策略,
MyCheckInPolicy
没有出现1 - 如果我打开已经使用此签入策略的团队项目并执行上述操作,我收到一条错误消息,告诉我程序集 (
mycheckinpolicy
) "has not been registered".
当然,我在更改注册表后重新启动了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 中正常运行所经历的步骤:
- 安装 Visual Studio SDK(如果您最初没有 select 工作量,可以通过 modifying 安装完成)。
- 将新的 VSIX 项目 添加到您的签入策略解决方案
使用以下内容(这是注册表项)将
.pkgdef
文件添加到 VSIX 项目:[$RootKey$\TeamFoundation\SourceControl\Checkin Policies] "YourPolicy"="$PackageFolder$\YourPolicy.dll"
在 VSIX 项目中修改
source.extension.vsixmanifest
(使用 GUI 向导):- 安装目标:添加支持的最低 VS 版本:
Microsoft.VisualStudio.Community [15.0,16.0)
Microsoft.VisualStudio.IntegratedShell [15.0,16.0)
- 资产:
- Microsoft.VisualStudio.Assembly
- 当前解决方案中的项目
- 项目:Select 您的签入政策项目
- Microsoft.VisualStudio.VsPackage
- 文件系统上的文件
- 路径:Select 来自第 3 步的 .pkgdef 文件。
- Microsoft.VisualStudio.Assembly
- 先决条件:
Visual Studio core editor [15.0,16.0)
- 安装目标:添加支持的最低 VS 版本:
- 构建 VSIX 项目和 distribute/install 生成的 vsix
This GitHub 存储库有助于将所有内容拼凑在一起。我在迁移到 vsix 时发现的一些怪癖:
- 默认情况下,vsix 现在是按用户安装的。如果您在同一台机器上的多个用户下操作 VS,则需要为每个用户安装它。 vsixmanifest 中有一个选项可以为所有用户安装扩展,但这需要提升。
- 我们的签入策略使用了 app.config 文件,vsix 不支持该文件。我必须 migrate 我们的设置到
.settings
文件。
将此密钥添加到 HKCU 对我有用:
HKEY_CURRENT_USER\SOFTWARE\Microsoft\VisualStudio.0\TeamFoundation\SourceControl\Checkin Policies
希望对您有所帮助。 谢谢, 威尔萨德