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中实施策略的步骤:
- 安装Visual Studio SDK(如果您最初未选择工作负载,则可以通过修改安装来完成)。
- 将新的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
- 当前解决方案中的项目
- 项目:选择您的签到政策项目
- Microsoft.VisualStudio.VsPackage
- 文件系统上的文件
- 路径:从步骤3中选择.pkgdef文件。
- Microsoft.VisualStudio.Assembly
- 先决条件:
Visual Studio core editor [15.0,16.0)
- 安装目标:添加支持最低的VS版本:
- 构建VSIX项目并分发/安装生成的vsix
这个 GitHub回购有助于拼凑所有东西。 迁移到vsix时发现的一些怪癖:
- 默认情况下,vsix安装现在是每用户。 如果您在同一台计算机上的多个用户下运行VS,则需要为每个用户安装VS. 在vsixmanifest中有一个选项可以为所有用户安装扩展,但这需要提升。
- 我们的签入策略使用了app.config文件,vsix中不支持该文件。 我不得不将我们的设置迁移到
.settings
文件。
我向HKCU添加了这个密钥:
HKEY_CURRENT_USER\SOFTWARE\Microsoft\VisualStudio\15.0\TeamFoundation\SourceControl\Checkin Policies
希望能帮助到你。 谢谢,威尔逊德