【问题标题】:Custom TFS Check-In Policy in Visual Studio 2017Visual Studio 2017 中的自定义 TFS 签入策略
【发布时间】:2017-08-12 21:24:55
【问题描述】:

不久前,我开发了一个自定义 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 不出现 em>1
  • 如果我已经打开使用此签入策略的团队项目并执行上述操作,我会收到一条错误消息,告诉我程序集 (mycheckinpolicy)“尚未注册”。

当然我在修改注册表后重启了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 IDE 中不起作用。

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

我们正在使用 TFS 12.0.30723.0


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

【问题讨论】:

    标签: c# visual-studio tfs visual-studio-2017


    【解决方案1】:

    在 Visual Studio 2017 中,breaking changes 可扩展性。大部分注册表配置已移至“私有”注册表:

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

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

    以下是我为使我们的政策在 VS 2017 中发挥作用所经历的步骤:

    1. 安装 Visual Studio SDK(如果您最初没有选择工作负载,可以通过 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
          • 当前解决方案中的一个项目
          • 项目:选择您的签入策略项目
        • Microsoft.VisualStudio.VsPackage
          • 文件系统上的文件
          • 路径:从步骤 3 中选择您的 .pkgdef 文件。
      3. 先决条件:Visual Studio core editor [15.0,16.0)
    5. 构建 VSIX 项目并分发/安装生成的 vsix

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

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

    【讨论】:

    • 非常感谢!我仍然不得不将引用的 dll 更改为 VS2017 版本(不知道为什么 nuget 包方式不起作用),但是您的精彩解释非常有效!我在使用 VS2017 时遇到了更多问题,例如用于 tfs 构建定义的自定义编辑器……但这些是另一天的问题……再次感谢。
    • 没问题,很高兴为您提供帮助。昨天我不得不经历解决这个问题的痛苦,因为那里什么都没有。
    • 我尝试按照您的步骤创建新的签入策略(谢谢!),但我在 Visual Studio 中找不到我的策略。我想要的是一个简单的策略,它检查所有待处理的更改文件中的某个单词,如果该单词存在,则签入应该失败。也许使用标准工具已经可以实现?提前致谢!
    • @Lumo 您的签入策略是否使用 TFS/VS 2017 参考(版本 15.0.0.0)?
    • 我刚刚添加了 NuGet 包“Microsoft.TeamFoundation.VersionControl.All”,唯一可选择的版本是 12.0.30723.2。我们使用的是 TFS 2015(版本 14.95.25229.0)。
    【解决方案2】:

    将这个密钥添加到 HKCU 对我很有用:

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

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

    【讨论】:

    • 我们在我们的环境中对此进行了测试,效果很好。签入政策在 VS2017 中可用。
    猜你喜欢
    • 2017-11-23
    • 1970-01-01
    • 2018-05-15
    • 2011-09-02
    • 2020-01-20
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    • 1970-01-01
    相关资源
    最近更新 更多