TFS未加载自定义程序集

时间:2014-09-02 09:04:10

标签: tfs process build assemblies

我在尝试让构建控制器/代理从我的构建过程模板中使用的引用中获取自定义程序集时遇到问题。

我已经在多个博客中广泛阅读了这个问题,遗憾的是我无法解决此问题:

TFS Build Error Log]

我可以确认以下内容:

  1. TFS 2012,没有更新Visual Studio 2013,Update 1(创建 活动并升级构建过程模板)

  2. 一个带有多个代理的构建控制器

  3. 在源代码管理中签入TFS程序集

  4. Custom Assembly Checked In]

    在重新启动服务的构建控制器中设置了正确的路径: [Build Controller Settings

    在遵循这些博客中使用的指南时,自定义活动在模板中正确解析:

    http://www.ewaldhofman.nl/post/2010/04/29/Customize-Team-Build-2010-e28093-Part-4-Create-your-own-activity.aspx

    http://blogs.msdn.com/b/jimlamb/archive/2010/02/12/how-to-create-a-custom-workflow-activity-for-tfs-build-2010.aspx

    Build Process Template - Custom Activity Resolving Correctly (assembly updater)

    我可以在构建过程模板的XAML中查看引用,它看起来很好,没有验证错误,我的代码活动似乎正确实现。

    以下代码:

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.IO;
    using System.Linq;
    using System.Reflection;
    using System.Text;
    using System.Activities;
    using System.Text.RegularExpressions;
    using Microsoft.TeamFoundation.Build.Client;
    using Microsoft.TeamFoundation.VersionControl.Client;
    
    namespace FireWatch.TFS
    {
        [BuildActivity(HostEnvironmentOption.Agent)]
        public sealed class AssemblyUpdater : CodeActivity
        {
            #region Static Methods
            #endregion   
    
            #region Property Variables
            #endregion
    
            #region Constants and Read-Onlys
            private const string ASSEMBLY_VERSION_REG_EX = @"\(""\d+\.\d+\.\d+\.\d+""\)";
            private const string ATTRIBUTE_REG_EX = "AssemblyVersion";
            #endregion
    
            #region Accessors
    
            [RequiredArgument]
            public InArgument<int> Major { get; set; }
            [RequiredArgument]
            public InArgument<int> Minor { get; set; }
            [RequiredArgument]
            public InArgument<int> Build { get; set; }
            [RequiredArgument]
            public InArgument<Workspace> Workspace { get; set; }
    
            #endregion
    
            #region Encapsulation
    
            private void UpdateAssemblyInfo(IEnumerable<string> assemblyInfos, int major, int minor, int build)
            {
                foreach (string myAssemblyInfo in assemblyInfos)
                {
                    string myFileText = File.Exists(myAssemblyInfo) ? File.ReadAllText(myAssemblyInfo) : string.Empty;
    
                    if (myFileText != string.Empty)
                    {
                        Regex myRegex = new Regex(ATTRIBUTE_REG_EX + ASSEMBLY_VERSION_REG_EX);
                        Match myMatch = myRegex.Match(myFileText);
    
                        if (myMatch.Success)
                        {
                            string myVersionNumber = myMatch.Value.Substring(ATTRIBUTE_REG_EX.Length + 2,
                                                     myMatch.Value.Length - ATTRIBUTE_REG_EX.Length - 4);
    
                            Version myCurrentVersion = new Version(myVersionNumber);
                            Version myNewVersion = new Version(major, minor, build, (myCurrentVersion.Revision + 1));
    
                            string myUpdatedAssemblyText = myRegex.Replace(myFileText, ATTRIBUTE_REG_EX + "(\"" + myNewVersion + "\")");
    
                            File.WriteAllText(myAssemblyInfo, myUpdatedAssemblyText);
                        }
                    }
                }
            }
    
            private void CheckOut(Workspace workspace, IList<string> assemblyInfos)
            {
                if (workspace != null && assemblyInfos != null && assemblyInfos.Any())
                {
                    workspace.PendEdit(assemblyInfos.ToArray());
                }
            }
    
            private IEnumerable<string> GetRelevantAssemblyInfos(Workspace workspace)
            {
                IList<string> myReturn = new List<string>();
    
                PendingChange[] myPendingChanges = workspace.GetPendingChanges();
    
                foreach (PendingChange myPendingChange in myPendingChanges)
                {
                    string myPath = AssemblyInfoPresent(myPendingChange);
    
                    if (!string.IsNullOrEmpty(myPath))
                    {
                        myReturn.Add(myPath);
                    }
                }
    
                return myReturn;
            }
    
            private string AssemblyInfoPresent(PendingChange pendingChange)
            {
                string myReturn = string.Empty;
    
                if (pendingChange != null)
                {
                    string myParentDirectory = pendingChange.LocalItem;
                    string myParentLevelAssemblyInfo = myParentDirectory + @"\AssemblyInfo.cs";
    
                    string myPropertiesDirectory = pendingChange.LocalItem + @"\Properties";
                    string myPropertiesLevelAssemblyInfo = myParentDirectory + @"\Properties\AssemblyInfo.cs";
    
                    if (Directory.Exists(myPropertiesDirectory) && File.Exists(myPropertiesLevelAssemblyInfo))
                    {
                        myReturn = myPropertiesLevelAssemblyInfo;
                    }
                    else if (Directory.Exists(myParentDirectory) && File.Exists(myParentLevelAssemblyInfo))
                    {
                        myReturn = myParentLevelAssemblyInfo;
                    }
                }
    
                return myReturn;
            }
    
            #endregion
    
            #region CodeActivity Members
    
            protected override void Execute(CodeActivityContext context)
            {
                int myMajor = context.GetValue(this.Major);
                int myMinor = context.GetValue(this.Minor);
                int myBuild = context.GetValue(this.Build);
                Workspace myWorkspace = context.GetValue(this.Workspace);
    
                IList<string> myAssemblyInfos = GetRelevantAssemblyInfos(myWorkspace).Distinct().ToList();
    
                if (myAssemblyInfos.Any())
                {
                    CheckOut(myWorkspace, myAssemblyInfos);
                    UpdateAssemblyInfo(myAssemblyInfos, myMajor, myMinor, myBuild);
                }
            }
    
            #endregion
        }
    }
    

2 个答案:

答案 0 :(得分:3)

你重启了机器吗?尝试清除构建机器上的缓存

C:\ Users \ BUILDACCOUNT \ AppData \ Local \ Temp \ BuildController \ 2.0 \ Assemblies

C:\ Users \ BUILDACCOUNT \ AppData \ Local \ Temp \ BuildAgent \ BUILDAGENTNO \ Assemblies

任何一种方式都应该强制构建控制器下载最新的程序集

答案 1 :(得分:0)

最后,通过将TFS 2013与最新的Service Pack一起解决了这个问题。现在可以毫无问题地加载自定义程序集。