【问题标题】:Building with code contracts on AppHarbor在 AppHarbor 上使用代码合约构建
【发布时间】:2012-10-26 18:44:47
【问题描述】:

我正在尝试部署我的第一个 AppHarbor 托管应用,但我的构建遇到了问题。在代码合同尝试重写程序集之前,一切都很好。日志中的错误是:

CodeContractsRunCodeAnalysisInternal:
     CodeContracts: Task manager is unavailable (unable to run in background).
     CodeContracts: ABC: Run static contract analysis.
     CodeContracts: ABC: Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'System.Data.SqlServerCe, Version=3.5.1.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91' or one of its dependencies. The system cannot find the file specified.
     CodeContracts: ABC:    at Microsoft.Research.CodeAnalysis.SQLCacheDataAccessor.GetMetadataOrNull(String key, Boolean silent)
     CodeContracts: ABC:    at Microsoft.Research.CodeAnalysis.CacheManager`11.TestCache()
     CodeContracts: ABC:    at Microsoft.Research.CodeAnalysis.CacheManager`11..ctor(Dictionary`2 methodAnalyses, Dictionary`2 classAnalyses, GeneralOptions options)
     CodeContracts: ABC:    at Microsoft.Research.CodeAnalysis.CacheManager`11.Create(Dictionary`2 dictionary, Dictionary`2 dictionary_2, GeneralOptions generalOptions)
     CodeContracts: ABC:    at Microsoft.Research.CodeAnalysis.Clousot.TypeBinder`9..ctor(String[] args, IDecodeMetaData`9 mdDecoder, IDecodeContracts`5 contractDecoder, IDictionary assemblyCache, Action`3 setTargetPlatform, IOutputFullResultsFactory`2 externalOutputFactory)
     CodeContracts: ABC:    at Microsoft.Research.CodeAnalysis.Clousot.ClousotMain[Local,Parameter,Method,Field,Property,Event,Type,Attribute,Assembly](String[] args, IDecodeMetaData`9 mdDecoder, IDecodeContracts`5 contractDecoder, IDictionary assemblyCache, Action`3 setTargetPlatform)
     CodeContracts: ABC:    at Microsoft.Research.CodeAnalysis.CCI1Driver.Main(String[] args)
     CodeContracts: ABC: 
     CodeContracts: ABC: Static contract analysis done.

我知道,在使用 Visual Studio 本地构建时,代码契约的内容在后台线程中运行。也许 AppHarbor 不允许创建这样的线程来执行此操作?但是关于 System.Data.SqlServerCe.dll 缺少这个错误是什么?我的代码肯定不使用它,但也许 MS 代码合同可以使用它?

只是想知道是否有人成功地将其中包含代码合同的代码部署到 AppHarbor,如果是,您做了什么使其工作?可能需要通过 AppHarbor 安装 SQL Server CE 才能使代码契约正常工作。哦,我的构建并没有构建代码契约引用程序集,它只是尝试进行静态检查并进行重写以完成运行时检查。

最后,我确实尝试从 AppHarbor.sln 禁用代码协定,但该设置是项目设置而不是解决方案设置,因此它也会为我的常规解决方案文件禁用它们。

【问题讨论】:

    标签: code-contracts appharbor


    【解决方案1】:

    想通了。 .NET 代码契约(System.Diagnostics.Contracts 命名空间,对于那些不知道的人来说)有一个功能,可以根据已放入代码中的契约对代码进行静态分析。如果您安装了用于代码合同的 Visual Studio 附加组件,您可以转到 VS 项目的属性页并单击代码合同选项卡。在静态检查部分有一个称为缓存结果的选项。如果启用此功能,则静态检查在构建时使用 SQL Server 嵌入式数据库,以使其对其静态代码分析所做的一切运行得更快(显然,此文件将在编译之间保留在您的项目目录中)。这是构建服务器对 SQL CE 的依赖,与应用的运行时环境无关。

    由于 AppHarbor 在他们的构建服务器上没有 SQL CE,我所做的是更改我的每个项目的代码合同属性以执行运行时合同检查并为调试和发布构建执行静态合同检查,但对于执行静态合同检查部分中的发布构建缓存结果选项被禁用。 (另请注意,由于 AppHarbor 不允许后台任务从 Visual Studio 运行,因此还必须禁用“执行静态合同检查”部分的“后台检查”选项。)

    为什么看起来我是唯一一个使用 System.Diagnostics.Contracts 命名空间(而不是 .NET Framework 本身)的人?

    【讨论】:

    • 您是否找到了一种方法来以某种方式更改 SQL Server CE 的代码合同要求?推荐使用 System.Data.SqlClient 的 localdb。这对于 AppHarbor 用户来说也非常好,谢谢!
    • AppHarbor 不允许在其构建服务器上使用 Visual Studio 的缓存结果功能,这就是使用 SQL CE 的原因。因此,只需在您的解决方案中关闭该选项(请参阅我的第二段)。
    【解决方案2】:

    我对代码合同不是很熟悉,但问题可能只是因为您缺少 SQL Server CE。您可能想尝试一个不使用 SQL Server CE 的项目来进行检查。考虑使用 NuGet 或作为可部署 bin 的程序集添加 SQL Server CE,以确保它在 AppHarbor 运行您的构建时可用。 this blog post 有更多信息。

    【讨论】:

    • 尝试了 SQL Server Compact 包,但没有成功。事实证明,我已经为 Release 版本“打开”了代码合同,而只为 Debug 版本“关闭”了它们。修复了这个问题并构建了解决方案。好吧,我得到一个“命名空间视图模型”在预编译期间不存在,但它似乎已经通过了 MSBuild 部分。据我所知,需要在构建服务器上安装 SQL Server CE 才能使代码契约正常工作。在这方面我们将如何处理 AppHarbor?
    • @gdoten 我们不太可能在构建服务器上安装 SQL Server CE。我们尽量保持它们尽可能精简,以避免人们遇到安装的依赖项、错误版本等问题。我建议您尝试在不需要安装 SQL Server CE 的情况下让您的代码合同工作 - 您可以通过从本地计算机卸载 SQL Server CE 来进行试验。
    • 我不使用 SQL Server CE .. .net 框架的代码契约命名空间作为解决方案构建的一部分(它不在运行时使用它)
    【解决方案3】:

    虽然 Code Contracts 生成的每条错误消息都表明您需要安装 SQL Server CE 3.5.1,但您确实必须安装版本 3.5.2

    卸载所有其他 3.5.x 版本的 SQL Server CE 并安装 this 对我有用。是的,如果您在 64 位机器上,您确实需要 32 位和 64 位版本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多