2014-09-02 115 views
3

我遇到了问题,试图让我的构建控制器/代理从我的构建过程模板中使用的引用中选择自定义程序集。TFS不加载自定义程序集

我读过关于这个问题的广泛跨越几个博客,不幸的是,我一直无法来解决这个问题:

TFS Build Error Log]

我可以确认以下内容:

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

  2. 一个生成控制器与多发剂

  3. 的TFS大会和源控制

Custom Assembly Checked In]

正确的路径设置与服务构建控制器内内检查重新启动: [Build Controller Settings

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

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

您重新启动机器?尝试

ç清除构建机器上的缓存:\用户\ BUILDACCOUNT \应用程序数据\本地的\ Temp \ BuildController \ 2.0 \大会

C:\用户\ BUILDACCOUNT \应用程序数据\本地\ TEMP \ BuildAgent \ BUILDAGENTNO \大会

无论哪种方式应该强制生成控制器使用TFS 20下载最新的组件

+0

我们的构建控制器每晚重新启动,但构建代理尚未重新启动。我会期待今晚重新启动我的构建代理,并希望这可以解决问题。谢谢你的帮助,谢谢。 – Slavvy 2014-09-02 10:11:07

+0

不幸的是,这并没有解决这个问题。我很感激帮助,你有没有可靠的教程展示如何扩展我可以尝试的代码活动?只是因为我有可能错过了一步。我相当有信心,虽然我没有。 – Slavvy 2014-09-03 07:49:57

+1

您的dll是否显示在这些缓存文件夹中? – 2014-09-03 07:59:16

0

到底该问题已解决13与最新的服务包。自定义程序集现在加载没有问题。