1

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

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

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

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

由于这些是我们正在讨论的自定义活动,因此我决定创建一个单元测试项目来验证它们。仅使用这 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。

4

2 回答 2

2

首先,我们需要我们的命令行工具来支持工作流活动,我们决定只实现普通的 MsBuild 任务,它是通用的并且也可以在 TFS 中工作。任务和目标文件包含在ReSharper CLT 8.2中。

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

最后但并非最不重要的一点是,您不需要放入 ReSharper SDK 包的 VCS 二进制文件。使用 NuGet 的还原包功能

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

于 2014-04-18T08:14:31.337 回答
1

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

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

于 2014-04-17T15:06:30.970 回答