Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# TFS从上次生成中获取SQL更改_C#_Tfs_Workflow Activity - Fatal编程技术网

C# TFS从上次生成中获取SQL更改

C# TFS从上次生成中获取SQL更改,c#,tfs,workflow-activity,C#,Tfs,Workflow Activity,我目前正在为TFS实现编写一个构建定义。我几乎所有的东西都在工作,除了我不能让最后一部分工作。 下面是我目前正在实现的CodeActivity类 在工作流图中,我使用默认的associatedChangesets变量作为InArgument 下面的代码可以工作并创建文件夹数据库,但是关联的变更集似乎不包含任何项目 public sealed class CreateDatabaseDrop : CodeActivity { public InArgument<Wo

我目前正在为TFS实现编写一个构建定义。我几乎所有的东西都在工作,除了我不能让最后一部分工作。 下面是我目前正在实现的CodeActivity类

在工作流图中,我使用默认的
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
。我想我这样做了,这是公司政策的一部分。我没想过验证是否设置了此项。感谢您的一些想法,如果成功,我会让您知道。