TFS构建需要比所需更多程序集的自定义活动

时间:2014-04-17 14:17:54

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

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

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

我遇到的第一个问题是nuget包绝对是 huge 。那里有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。

2 个答案:

答案 0 :(得分:2)

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

其次,如果你仍然想要实现工作流程活动,那么使用CLT中的新API非常容易,它专门用于自定义处理找到的问题 - http://confluence.jetbrains.com/display/NETCOM/Custom+InspectCode+Issue+Logger

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

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

答案 1 :(得分:1)

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

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