【问题标题】:TFS Build custom activity requiring more assemblies than neededTFS 构建自定义活动,需要比需要更多的程序集
【发布时间】:2014-04-17 14:17:53
【问题描述】:

我刚刚编写了工作流活动的第一个版本,它将在项目上运行 Resharper 的代码问题并解析输出以将问题显示为构建警告和错误。

起初,我打算只调用Resharper's command line 并手动解析生成的xml。在摆弄Resharper's SDK 中的 dll(主要通过反汇编)之后,我找到了一种使用它自己的公共类来解析结果的方法,我认为这是一种更优雅、更安全的方法。

我遇到的第一个问题是 nuget 包绝对是巨大。那里有 140mb 的文件,对我来说,这对于单个未分区的包来说是荒谬的。它们之间似乎存在如此严重的耦合,以至于通过仅使用几个模型类和解析器类,我不得不拖动十几个这样的 dll,其中一些似乎与我需要的主要 dll 无关.不过,这不是一个表演障碍,我现在正在为其他事情苦苦挣扎:

最后,我设法找到了 41 个程序集所需的依赖项(这又是疯狂的,但可惜)。最初,我尝试删除所有内容并一一添加缺少的引用,但结果证明这是不可靠的,即使编译成功,仍然缺少一些间接引用。然后,我决定编写一个小型控制台应用程序,以在我使用的主要 Resharper 程序集中查找所有引用的程序集,这给了我提到的 41 个引用。 This is the code I used 查找每个依赖项。

由于这些是我们正在讨论的自定义活动,我决定创建一个单元测试项目来验证它们。仅使用这 41 个参考,一切正常。

不过,当我将活动添加到构建工作流程并将构建控制器指向包含所需程序集的源代码控制文件夹时,每次我安排构建时,该过程都会失败,说明我需要一个来自 Resharper 的 SDK 的额外 dll。例如,这是它询问的第一个:

Could not load file or assembly 'AsyncBridge.Net35, PublicKeyToken=b3b1c0202c0d6a87' or one of its dependencies. The system cannot find the file specified. (type FileNotFoundException)

当我将此特定程序集添加到 TFS 文件夹时,我收到另一个 dll 的另一个类似错误,并且这种情况一直持续下去。

我想知道的是,我如何才能准确地知道工作流 XAML 需要哪些程序集才能正确运行?我的自定义活动 dll 有两个特定的 CodeActivities 和一个仅使用这两个的 XAML 活动。这个 XAML 活动是我在修改后的工作流模板中直接使用的。

我看到除了我的项目中的引用之外,XAML 活动还包含一个 TextExpression.ReferencesForImplementation 部分,其中包含一些程序集名称。我也对这些依赖项运行了依赖项查找程序,结果与 TFS 文件夹中已有的 41 个程序集相同。

同时,我会将整个 SDK 放入自定义程序集文件夹,但我真的希望以后避免这种情况,因为其中包含大量不需要的大 dll。

【问题讨论】:

    标签: tfs resharper workflow-foundation-4 tfsbuild assembly-references


    【解决方案1】:

    首先,我们向support workflow activity 请求我们的命令行工具,我们决定只实现plain MsBuild task,它是通用的并且也适用于TFS。任务和目标文件包含在ReSharper CLT 8.2 中。

    其次,如果您仍想实现工作流活动,使用 CLT 中的新 API 非常容易,该 API 专为自定义处理发现的问题而设计 - http://confluence.jetbrains.com/display/NETCOM/Custom+InspectCode+Issue+Logger

    最后但同样重要的是,您不需要放入 ReSharper SDK 包的 VCS 二进制文件。 使用 NuGet 的restore package functionality

    如果您有任何其他问题,我很乐意为您解答。

    【讨论】:

    • 天哪...我不敢相信我错过了那里的 .Targets。这实际上是一个更好的解决方案,但我认为你们永远不会以这种方式实现它,因为 TeamCity 中的集成是一个定义特性。不过,我仍然看不到如何将其分发给团队,因为命令行工具只是一个没有安装的 zip。如果开发人员的机器上没有无缝集成,那么它仍然是一个糟糕的解决方案。也许另一个特定的 nuget 包会是理想的?或者至少在现有包中包含这个 .Targets 文件。
    • 正如我之前所说,我不能将包还原用于我当前正在实施的内容(自定义工作流活动)。在构建过程中没有钩子可以让它下载包和东西。请记住,这比 msbuild 本身运行得早得多。
    【解决方案2】:

    .NET CLR 正在加载和运行自定义活动,就像任何其他 .NET 程序一样。如果堆栈跟踪报告缺少文件,则说明 CLR 需要它,并且您无法在不重构代码的情况下更改这一事实。

    在自定义程序集文件夹中包含整个 SDK 引用没有意义。我更喜欢 GAC 部署而不是源代码管理中的巨大二进制文件夹。或者考虑让这些活动在 MSBuild 或 PowerShell 中运行 pre\post 构建脚本。

    【讨论】:

    • 为什么它可以在单元测试下工作?另外,为什么GetReferencedAssemblies 找不到这些依赖项?不应该吗?最后,SDK 是一个 nuget 包,没有 MSI 安装程序。我认为将这些 dll 放在 GAC 上需要很长时间,因为我必须使用命令行来注册它们中的每一个(我在这方面可能非常错误,从未做过)。
    • 好吧,我很笨。有一个 msi 安装程序here。嗯,这可能有用。我将把它安装在构建服务器上,如果没有 TFS 中的那些 dll,它应该可以正常工作。我想我仍然需要 nuget 包,因为我不想强迫每个开发人员都安装 SDK。
    • 如果 SDK 是一个 nuget 包,你应该使用nuget package restore。我假设GetReferencedAssemblies 只能找到直接引用。
    • 这是我们正在谈论的构建工作流程,在甚至不是 msbuild 项目的东西中使用包还原没有任何意义(不幸的是)。我们已经对所有项目使用包还原,但构建过程工作流无法以这种方式工作,它需要在机器上的 GAC 中注册程序集,或者将控制器指向包含所需程序集的 TFS 文件夹。此外,如果 GetReferencedAssemblies 只找到直接引用,在我的情况下它将返回 4 或 5 个程序集,而不是 41 个。
    • 我可能错过了您要完成的工作的背景,但在我看来,从设计角度来说,您根本不应该使用 xaml 活动。我宁愿为此使用脚本。看看this
    猜你喜欢
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    • 2016-07-28
    相关资源
    最近更新 更多