TFS中的自定义签入策略?

| 我们的项目中有一些xml文件,每当将这些xml文件检入到TFS中时,我们都需要确保在检入之前已将这些xml文件添加到专有应用程序中。 现在,新员工更经常忘记在办理登机手续之前将文件添加到专有应用程序中,这变得越来越严重... 我们想要一个确认对话框(提醒),询问开发人员是否已将xml文件添加到应用程序中。如果是,则签入,否则请保持签出状态... 请提出这样的建议是否可行,任何相关的代码或链接将不胜感激。     
已邀请:
在自定义签入策略中引发UI是不合适的-签入策略的生命周期非常短,并且它们会被频繁评估,而不必在UI上下文或UI线程中进行评估。 您可以通过编程方式确定是否正在检入适当的XML文件吗?如果是这样,您可以创建一个自定义的签入策略,如果未为XML文件添加扩展名,该策略将失败。 门控检入可能是解决此问题的最佳解决方案:如果这些XML文件不存在,构建会失败吗?如果缺少这些文件,单元测试会失败吗?如果是这样,这是门控登机的理想之选,它将阻止这些登机的发生。     
我将创建一个自定义生成模板,以检查这些xml文件。进行门禁登机手续,您已经有了解决方案。     
Evaluate
方法应该是快速的并且不应显示UI,但是策略上有一个事件会在用户与with1ѭ策略交互时触发,这是显示UI并与策略进行通信的好时机。您可以执行以下操作:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace JesseHouwing.CheckinPolicies
{
    using System.Windows.Forms;

    using Microsoft.TeamFoundation.Client.Reporting;
    using Microsoft.TeamFoundation.VersionControl.Client;

    [Serializable]
    public class ConfirmPolicy :PolicyBase
    {
        private AffectedTeamProjectsEventHandler _affectedTeamProjectsEventHandler;
        private EventHandler _checkedPendingChangesEventHandler;

        public ConfirmPolicy()
        {
        }

        public void StatusChanged()
        {
            _userconfirmed = false;
            OnPolicyStateChanged(Evaluate());
        }

        public override void Initialize(IPendingCheckin pendingCheckin)
        {
            _affectedTeamProjectsEventHandler = (sender, e) => StatusChanged();
            _checkedPendingChangesEventHandler = (sender, e) => StatusChanged();

            base.Initialize(pendingCheckin);
            _userconfirmed = false;                
            pendingCheckin.PendingChanges.AffectedTeamProjectsChanged += _affectedTeamProjectsEventHandler;
            pendingCheckin.PendingChanges.CheckedPendingChangesChanged += _checkedPendingChangesEventHandler;
        }

        protected override void OnPolicyStateChanged(PolicyFailure[] failures)
        {
            _userconfirmed = false;
            base.OnPolicyStateChanged(Evaluate());
        }

        public override void Activate(PolicyFailure failure)
        {
            if (MessageBox.Show(\"Confirm the policy?\", \"Policy Check\", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                _userconfirmed = true;
                base.OnPolicyStateChanged(Evaluate());
            }
        }

        public override PolicyFailure[] Evaluate()
        {
            if (_userconfirmed == true)
            {
                return new PolicyFailure[0];
            }
            else
            {
                return new PolicyFailure[]{new PolicyFailure(\"User must confirm\", this)};
            }
        }

        public override string Description
        {
            get { throw new NotImplementedException(); }
        }

        public override bool Edit(IPolicyEditArgs policyEditArgs)
        {
            return true;
        }

        public override string Type
        {
            get
            {
                return \"User Confirm\";
            }
        }

        public override string TypeDescription
        {
            get
            {
                return \"User Confirm\";
            }
        }

        public override void Dispose()
        {
            this.PendingCheckin.PendingChanges.AffectedTeamProjectsChanged -= _affectedTeamProjectsEventHandler;
            this.PendingCheckin.PendingChanges.CheckedPendingChangesChanged -= _checkedPendingChangesEventHandler;

            base.Dispose();
        }
    }
}
我尚未测试此确切的代码,可能需要进行一些调整,但这是一般的事情。现在,它会触发签入文件的更改,但是您也可以订阅其他任何事件(工作项更改),或者在每次调用Evaluate时触发您自己的项目评估。 或者,您可以在每个签到周期触发一次确认。全取决于你。您甚至可以执行“单击以关闭”,并完全跳过
Messagebox
。只需设置
_userConfirmed=true
并触发
PolicyStateChanged
事件即可。     

要回复问题请先登录注册