1

現在、TFS 実装のビルド定義に取り組んでいます。この最後の部分が機能しないことを除いて、ほとんどすべてが機能しています。以下は、私が現在実装している CodeActivity クラスです。

ワークフロー図では、デフォルトassociatedChangesets変数を InArgument として利用しています。

次のコードは機能し、フォルダーを作成しますDatabaseが、AssociatedChangesetsアイテムが含まれていないようです。

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);
                }
            }
        }

最後のビルドが完了してからのすべての SQL 変更を取得する方法を理解するのを手伝ってくれる人はいますか?

4

1 に答える 1

2

私は最終的にこれを行う方法を見つけました。将来の参考のために、また同じ問題に遭遇した人のために、ほとんどのコードを以下に示します。

    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));

                    }
                }
            }
    }
于 2012-08-24T10:17:40.960 に答える