我们在我们的项目中有一些xml文件,每当我们将这些xml文件签入TFS时,我们在签入之前确保已将这些xml文件添加到专有应用程序中。自定义检入TFS策略?
现在,新员工往往忘记在入住前将文件添加到专有应用,这是越来越严重......
我们希望还挺确认对话框(提醒),询问开发商是否已经添加了XML文件到应用程序。如果是,然后办理登机手续,否则保持签出...
请建议如果这样的事情是可能的,任何相关的代码或链接将非常感激。
我们在我们的项目中有一些xml文件,每当我们将这些xml文件签入TFS时,我们在签入之前确保已将这些xml文件添加到专有应用程序中。自定义检入TFS策略?
现在,新员工往往忘记在入住前将文件添加到专有应用,这是越来越严重......
我们希望还挺确认对话框(提醒),询问开发商是否已经添加了XML文件到应用程序。如果是,然后办理登机手续,否则保持签出...
请建议如果这样的事情是可能的,任何相关的代码或链接将非常感激。
在自定义签入策略中提高UI是不合适的 - 签入策略的生命周期非常短,并且它们将经常进行评估,而不一定在UI上下文或UI线程中进行评估。
您能否以编程方式确定是否正在检入适当的XML文件?如果是这样,您可以创建一个自定义签入策略,如果XML文件未被添加,则该策略将失败。
门控签入可能是解决此问题的最佳解决方案:如果这些XML文件不存在,那么构建会失败 - 或者如果这些文件丢失,单元测试会失败吗?如果是这样,这是门禁登机手续的完美人选,这将阻止发生这些登机手续。
我会创建一个自定义构建模板来检查这些xml文件。使它成为门控办理登机手续,并且您已经获得了解决方案。
我会这样做,除了政策。 – jessehouwing 2014-01-31 17:29:09
Evaluate
方法应该是快速的,不应该显示UI,但是当用户与名为Activate
的策略进行交互时会触发策略事件,这是显示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
事件。
我在我自己的一个政策中实现了这一点,它在这里共享:https://github.com/jessehouwing/tfstools/blob/master/JesseHouwing.CheckinPolicies/WarnMultipleBranchPolicy.cs – jessehouwing 2014-02-17 15:20:51
非常感谢您的回答......恐怕它既不会崩溃的构建也不会单元测试失败,如果这些XML文件丢失... – Dexterslab 2011-05-26 18:56:41
所以,我期待这是不可能做... – Dexterslab 2011-05-26 19:01:10
在这种情况下,我会考虑利用这些工作项目 - 毕竟,你试图确保你的开发人员已经完成了一些工作(在这种情况下,检查XML文件) – 2011-05-26 19:03:09