C# TFS从上次生成中获取SQL更改
我目前正在为TFS实现编写一个构建定义。我几乎所有的东西都在工作,除了我不能让最后一部分工作。 下面是我目前正在实现的CodeActivity类 在工作流图中,我使用默认的C# TFS从上次生成中获取SQL更改,c#,tfs,workflow-activity,C#,Tfs,Workflow Activity,我目前正在为TFS实现编写一个构建定义。我几乎所有的东西都在工作,除了我不能让最后一部分工作。 下面是我目前正在实现的CodeActivity类 在工作流图中,我使用默认的associatedChangesets变量作为InArgument 下面的代码可以工作并创建文件夹数据库,但是关联的变更集似乎不包含任何项目 public sealed class CreateDatabaseDrop : CodeActivity { public InArgument<Wo
associatedChangesets
变量作为InArgument
下面的代码可以工作并创建文件夹数据库
,但是关联的变更集
似乎不包含任何项目
public sealed class CreateDatabaseDrop : CodeActivity
{
public InArgument<Workspace> Workspace { get; set; }
public InArgument<string> DropLocation { get; set; }
public InArgument<IList<Changeset>> AssociatedChangesets { get; set; }
// If your activity returns a value, derive from CodeActivity<TResult>
// and return the value from the Execute method.
Workspace workspace;
string dropLocation;
IList<Changeset> associatedChangesets;
protected override void Execute(CodeActivityContext context)
{
List<string> filesChanged = new List<string>();
workspace = context.GetValue(this.Workspace);
dropLocation = context.GetValue(this.DropLocation);
associatedChangesets = context.GetValue(this.AssociatedChangesets);
if (!Directory.Exists(dropLocation + @"\database\"))
Directory.CreateDirectory(dropLocation + @"\database\");
foreach (var c in associatedChangesets.OrderBy(x => x.CreationDate))
{
foreach (var change in c.Changes)
{
context.WriteBuildMessage(change.Item.ServerItem);
}
foreach (var change in c.Changes.Where(x => x.Item.ItemType == ItemType.File && x.Item.ServerItem.Split('/').Last().ToLower().Contains(".sql")))
{
string fileName = change.Item.ServerItem.Split('/').Last();
context.WriteBuildMessage(string.Format("SQL File Found: {0}", change.Item.ServerItem));
WorkingFolder wf = workspace.GetWorkingFolderForServerItem(change.Item.ServerItem);
string copyFrom = Path.Combine(wf.LocalItem, fileName),
copyTo = dropLocation + @"\database\" + fileName;
context.WriteBuildMessage(string.Format("Copying {0} to {1}", fileName, copyTo));
File.Copy(copyFrom, copyTo, true);
}
}
}
公共密封类CreateDatabaseDrop:CodeActivity
{
公共InArgument工作区{get;set;}
公共非独占位置{get;set;}
公共InArgument关联的变更集{get;set;}
//如果活动返回值,则从CodeActivity派生
//并从Execute方法返回值。
工作空间;
串定位;
IList关联变更集;
受保护的覆盖无效执行(CodeActivityContext上下文)
{
List filesChanged=新列表();
workspace=context.GetValue(this.workspace);
dropLocation=context.GetValue(this.dropLocation);
associatedChangesets=context.GetValue(this.associatedChangesets);
如果(!Directory.Exists(dropLocation+@“\database\”)
目录.CreateDirectory(dropLocation+@“\database\”;
foreach(associatedChangesets.OrderBy(x=>x.CreationDate)中的变量c)
{
foreach(c.变化中的var变化)
{
WriteBuildMessage(change.Item.ServerItem);
}
foreach(c.Changes.Where(x=>x.Item.ItemType==ItemType.File&&x.Item.ServerItem.Split('/').Last().ToLower().Contains(“.sql”))
{
字符串文件名=change.Item.ServerItem.Split('/').Last();
WriteBuildMessage(string.Format(“找到的SQL文件:{0}”,change.Item.ServerItem));
WorkingFolder wf=workspace.GetWorkingFolderForServerItem(change.Item.ServerItem);
字符串copyFrom=Path.Combine(wf.LocalItem,文件名),
copyTo=dropLocation+@“\database\”文件名;
WriteBuildMessage(string.Format(“将{0}复制到{1}”,文件名,copyTo));
File.Copy(copyFrom、copyTo、true);
}
}
}
有谁能帮我弄清楚自上次构建完成以来,如何获得所有SQL更改。我最终找到了如何做到这一点。我将在下面列出大部分代码,供将来参考和遇到相同问题的人使用
public sealed class CreateDatabaseDrop : CodeActivity
{
[RequiredArgument]
public InArgument<Workspace> Workspace { get; set; }
[RequiredArgument]
public InArgument<IBuildDefinition> BuildDefinition { get; set; }
[RequiredArgument]
public InArgument<string> ProjectName { get; set; }
Workspace workspace;
protected override void Execute(CodeActivityContext context)
{
workspace = context.GetValue(this.Workspace);
IBuildDefinition buildDef = context.GetValue(this.BuildDefinition);
DateTime? comparison = null;
var details = buildDef.QueryBuilds().Where(x => x.Status == BuildStatus.Succeeded).OrderBy(x => x.StartTime);
if (details.Count() > 0)
{
comparison = details.Last().StartTime;
}
if (!comparison.HasValue)
{
return;
}
IEnumerable history = workspace.VersionControlServer.QueryHistory("$/" + context.GetValue(ProjectName),
VersionSpec.Latest,
0,
RecursionType.Full,
null,
new DateVersionSpec(comparison.Value),
VersionSpec.Latest,
Int32.MaxValue,
true,
false);
foreach (Changeset c in history.OfType<Changeset>().OrderBy(x => x.CreationDate))
{
foreach (var change in c.Changes.Where(x => x.Item.ItemType == ItemType.File
&& x.Item.ServerItem.Split('/').Last().ToLower().Contains(".sql")
&& (x.ChangeType != (ChangeType.Delete | ChangeType.SourceRename | ChangeType.Rename))))
{
string fileName = change.Item.ServerItem.Split('/').Last();
WorkingFolder wf = workspace.TryGetWorkingFolderForServerItem(change.Item.ServerItem);
if (wf != null && !string.IsNullOrEmpty(wf.LocalItem))
{
context.WriteBuildMessage(string.Format("SQL File found: {0}", fileName));
}
}
}
}
公共密封类CreateDatabaseDrop:CodeActivity
{
[必需参数]
公共InArgument工作区{get;set;}
[必需参数]
公共InArgument构建定义{get;set;}
[必需参数]
公共InArgument项目名称{get;set;}
工作空间;
受保护的覆盖无效执行(CodeActivityContext上下文)
{
workspace=context.GetValue(this.workspace);
IBuildDefinition buildDef=context.GetValue(this.BuildDefinition);
DateTime?比较=null;
var details=buildDef.QueryBuilds().Where(x=>x.Status==BuildStatus.successed).OrderBy(x=>x.StartTime);
如果(details.Count()>0)
{
比较=details.Last().StartTime;
}
如果(!comparison.HasValue)
{
返回;
}
IEnumerable history=workspace.VersionControlServer.QueryHistory(“$/”+context.GetValue(ProjectName),
版本规格最新,
0,
RecursionType.Full,
无效的
新的DateVersionSpec(comparison.Value),
版本规格最新,
Int32.MaxValue,
是的,
假);
foreach(history.OfType().OrderBy(x=>x.CreationDate)中的变更集c)
{
foreach(c.Changes.Where(x=>x.Item.ItemType==ItemType.File)中的变量change
&&x.Item.ServerItem.Split(“/”).Last().ToLower()包含(“.sql”)
&&(x.ChangeType!=(ChangeType.Delete | ChangeType.SourceRename | ChangeType.Rename)))
{
字符串文件名=change.Item.ServerItem.Split('/').Last();
WorkingFolder wf=workspace.tryNetworkingFolderForServerItem(change.Item.ServerItem);
if(wf!=null&&!string.IsNullOrEmpty(wf.LocalItem))
{
WriteBuildMessage(string.Format(“找到的SQL文件:{0}”,文件名));
}
}
}
}
您将活动放在工作流中的什么位置?您是从序列范围内的I ilddetail.AssociatedChangesets
或名为AssociatedChangesets
的变量中获取值的吗?我正在使用默认Xaml模板上的变量AssociatedChangesets。@DaveShaw代码中是否还有要删除的内容获取关联的变更集。我一直在尝试进行一些搜索,但我真的不知道如何查询工作区来执行此操作。或者,如果您有“关联变更集和工作项”在构建定义中设置为true,然后在发生associatedChangesets和WorkItems
后,您可以使用associatedChangesets
。我想我这样做了,这是公司政策的一部分。我没想过验证是否设置了此项。感谢您的一些想法,如果成功,我会让您知道。