【问题标题】:Using build with TFS2010 on projects that use moles assemblies fail with -1002 as cannot resolve reference在使用 moles 程序集的项目上使用 TFS2010 构建失败并显示 -1002,因为无法解析引用
【发布时间】:2011-07-11 03:32:10
【问题描述】:

在玩了很多之后,我设法让 TFS 能够在我的所有项目上运行构建,除了测试项目。它们里面有一个鼹鼠组件。

我得到的错误是

C:\Program Files\Microsoft Moles\bin\Microsoft.Moles.targets (79):
命令“C:\Program Files\Microsoft Moles\bin\moles.exe”
@"C:\Builds\2\cv2\DevBranchBuild\Sources\CV.BL.Tests\obj\Release\Moles\moles.args""
以代码 -1002 退出。

警告是

C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets (1360):
无法解析此引用。
找不到程序集“CV.DAL.Moles,版本=1.0.0.0,文化=中性,处理器架构=MSIL”。
检查以确保该程序集存在于磁盘上。
如果您的代码需要此引用,则可能会出现编译错误。

CV.DAL 是我正在考虑的组件。

我正在使用最新版本的 pex 和 moles。

我还将CV.DAL.moles 文件检入到 TFS(不是程序集)中。 一切都在我的本地机器上构建得非常好。我用来构建的机器具有完全相同的配置。确切地说,我的意思是一个是 32 位,另一个是 64 位:o(那里严重疏忽)。

有什么想法吗?

这使得 pex 和 moles 完全没用,因为它在合并分支时打破了门控签入,这是一个巨大的耻辱,因为我在它们上投入了大量的时间。

编辑

哪些molesAssemblies 目录?
moles 的安装文件夹还是项目下的目录?
安装文件夹在两台机器上具有相同的文件和文件大小。

【问题讨论】:

  • 愚蠢的评论,但我你已经在你的构建机器上安装了完全相同版本的 Pex 和 Moles.. 对吗? (我们在自动构建中使用 Pex 和 Moles,通常出现问题时是因为版本不同。)
  • 检查您的构建机器和本地机器上的 MolesAssemblies 文件夹是否相同。 (MolesAssemblies 文件夹在测试项目下。)它应该有 moles dll。
  • 嗨,感谢您的编辑,不幸的是那是很久以前的事了,我现在正在做一个完全不同的项目。在这一点上,我问了我没有使用 nuget 的问题,所以它会在任何地方安装 moles 安装程序包(来自 microsoft 研究站点 iirc 安装)。所以是的,它会是完全相同的版本(作为相同的安装程序)并且会使用默认位置。

标签: tfs pex moles pex-and-moles


【解决方案1】:

这可能是两个问题之一——我前段时间遇到了这两个问题:

(one) 您的依赖项之一被标记为 32 位。这可能是 cv.dal.dll 或其任何依赖项。 Moles.exe 必须加载程序集才能执行——不知道为什么它不使用 Load.RefrectionOnly——而且由于 moles.exe 是 ILONLY,它在 64 位机器上作为 64 位进程执行。这使得痣的产生失败。

解决方法是将 moles.exe 设置为仅 32 位:

corflags moles.exe /Force /32BIT+

(二)如果您使用并行构建(例如,在您的 .msbuild 文件中,您有选项 BuildInParallel="true" ,或者您使用选项 /m 运行 msbuild.exe)并且您在单元测试项目的 PreBuildEvent 中创建了痣,然后您将遇到 msbuild 目标的问题。 PreBuildEvent 在解析引用之前执行,并且在解析引用时检查跨项目依赖关系,因此您的 PreBuildEvent 有可能在依赖项目完成构建之前开始执行。

没有很好的解决方法。您可以使用非并行构建(这会使您的构建变慢),或者您可以将预先生成的 *.moles.dll 检入源代码控制(每次触摸您的摩尔组件时都必须维护和更新)。

【讨论】:

  • 废话赏金的问题是您需要在时间限制内测试答案......我目前戴着我的释放帽。可惜他们有你无法调整的时间限制。
  • 这些建议对任何人都有效吗?我都尝试了,但我仍然遇到无法解析的引用的警告。然而,在构建目录中存在 .moles.dll 文件,并且根据它们的时间戳,是在特定构建期间生成的。
  • @Gorgsenegger,它对我有用。您可能希望在打开 MSBuild 诊断日志记录的情况下进行构建,以确定 Moles 程序集的生成时间——在编译之前或之后。 MSBuild 选项是/flp:LogFile=MyLog.log;Verbosity=diagnostic
【解决方案2】:

以前版本的 Moles 也存在类似问题。将 disableCache="true" 添加到 .moles 文件修复了这些问题: http://social.msdn.microsoft.com/Forums/en-US/pex/thread/a6d9a67b-0813-4392-a5dd-bea6eb479eea

【讨论】:

    猜你喜欢
    • 2011-08-26
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多