【问题标题】:TeamCity NUnitLauncher running on Linux (mono) gives "Corlib not in sync with this runtime" error在 Linux(单声道)上运行的 TeamCity NUnitLauncher 给出“Corlib 与此运行时不同步”错误
【发布时间】:2015-07-11 09:26:08
【问题描述】:

运行 TeamCity 构建代理以在 Ubuntu 14.04 LTC 上使用最新构建的 mono 运行 NUnit 测试似乎有一些我一生都无法解决的依赖问题。 我已按照以下安装步骤进行操作

当 TC Build Agent 启动 NUnit 步骤时,它只是失败了,查看日志显示它执行了

/usr/bin/mono-sgen /home/ubuntu/buildAgent/plugins/dotnetPlugin/bin/JetBrains.BuildServer.NUnitLauncher.exe

立即返回

Corlib not in sync with this runtime: expected corlib version 117, found 111.
Loaded from: /usr/lib/mono/4.0/mscorlib.dll
Download a newer corlib or a newer runtime at http://www.mono-project.com/download.

有没有办法让它工作?我尝试删除所有部件并重新安装,甚至安装旧版本的单声道构建,但无济于事。

TC 连接似乎工作,我可以手动调用和调用 mono 自己甚至 nunit-console 但是这个由 TC 提供的 .exe 构建似乎有被非 linux 专家难住了。

请救我脱离依赖地狱!!

编辑:我最终只是通过安装 nunit-console 并启用 XML 报告处理构建功能来解决我的问题,而不是玩弄 corelib 文件并破坏其他东西。

【问题讨论】:

    标签: linux ubuntu mono nunit teamcity


    【解决方案1】:

    这是一个 Mono 错误,请参阅 https://bugzilla.xamarin.com/show_bug.cgi?id=34675

    问题在于 Mono 转而仅以引用程序集的形式提供 4.0 程序集,包括 mscorlib.dll。它们仅包含元数据,并且适用于编译器。通常应用程序只是自动使用最新版本。

    然而,Mono 中的加载程序代码并未更新以将 TeamCity 在其 .exe.config 文件中使用的显式运行时版本 v4.0.20506 或 v4.0.30128 绑定到最新版本。运行时会尝试从 4.0 目录加载 mscorlib.dll 并因为版本太旧(从生成参考程序集时开始)而退出。

    作为一种解决方法,您可以编辑 <build agent installdir>/plugins/dotnetPlugin/bin/JetBrains.BuildServer.NUnitLauncher.exe.config(和其他 .exe.config 文件) 并删除以下行:

    <supportedRuntime version="v4.0.20506"/>
    <supportedRuntime version="v4.0.30128"/>
    

    一旦 TeamCity 决定更新插件,这可能会停止工作。

    【讨论】:

    • 我可以确认这是可行的。不确定 Mono 错误的状态,无法访问(未授权)。不过(截至目前),该修复似乎不在当前的单声道稳定版本中。
    • 当前状态:我已经用github.com/mono/mono/pull/2148 修复了潜在的错误,但它不会在即将推出的 Mono 4.2 中出现。我会确保它包含在之后的第一个服务版本中。
    【解决方案2】:

    更换 mscorlib 版本只是自找麻烦 - 即 TypeLoadException 和朋友们正等着你。

    我所做的是将 Teamcity 构建步骤替换为手动调用 TC NunitLauncher,但强制它使用 Mono 4.5:

    mono --runtime=4.5 /Applications/buildAgent/plugins/dotnetPlugin/bin/JetBrains.BuildServer.NUnitLauncher.exe v4.0 MSIL NUnit-2.6.3 $(find **/bin/Release/*Tests.dll | paste -sd ";" -)
    

    调用使用了一些 shell 技巧来查找我对使用通配符感兴趣的所有程序集,但除此之外应该很容易理解。

    如果 Mono 修复了他们损坏的 4.0 运行时,那就太好了。有人已经在https://bugzilla.xamarin.com/ 上报告了吗?

    【讨论】:

      【解决方案3】:

      这就是我解决它的方法:(注意我的单声道在 /opt/mono 中)

      $ cd /opt/mono/lib/mono
      $ sudo mv 4.0 __4.0
      $ sudo ln -s 4.5 4.0
      

      即删除 4.0 文件夹并将 4.5 符号链接为 4.0

      这有点像 hack,但它让我启动并运行,直到出现适当的修复!

      史蒂夫

      【讨论】:

      • 感谢您的提示,但最终又出现了另一个错误!我最终只是求助于运行“nunit-console”命令步骤以及启用 XML 报告处理构建功能。虽然测试不会流回服务器,但它现在可以完成这项工作。
      【解决方案4】:

      我在 Raspberry Pi 上编译 4.0.2 后遇到了这个问题,但它是从 /4.5/ 加载的

      这让我继续前进:

      sudo mv /usr/lib/mono/4.5/mscorlib.dll /usr/lib/mono/4.5/_old_mscorlib.dll
      sudo cp /opt/mono-4.0.2/lib/mono/4.5/mscorlib.dll /usr/lib/mono/4.5
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多