使用AppHarbor上的代码合同构建

时间:2012-10-26 18:44:47

标签: code-contracts appharbor

我正在尝试部署我的第一个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中禁用代码合同,但该设置是项目设置而不是解决方案设置,因此它也会为我的常规解决方案文件禁用它们。

3 个答案:

答案 0 :(得分:4)

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

由于AppHarbor在他们的构建服务器上没有SQL CE,我所做的就是更改我的每个项目的Code Contracts属性以执行Run Runtime Contract检查并对Debug和Release版本执行静态合同检查,但是“执行静态合同检查”部分中的“释放构建缓存结果”选项已禁用。 (另请注意,由于AppHarbor不允许从Visual Studio运行后台任务,因此还必须禁用“执行静态合同检查”部分中的“检入后台”选项。)

为什么我似乎是唯一使用System.Diagnostics.Contracts命名空间(.NET Framework本身除外)的人?

答案 1 :(得分:0)

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

答案 2 :(得分:0)

尽管Code Contracts产生的每条错误消息都表明您需要安装SQL Server CE 3.5.1,但您必须安装 3.5.2 版本。

卸载所有其他3.5.x版本的SQL Server CE并安装this让我感到满意。是的,如果您使用的是64位计算机,那么您确实需要32位和64位版本。