2012-10-26 4 views
4

첫 번째 AppHarbor-hosted app를 배포하려고하며 빌드에 문제가 있습니다. 코드 계약으로 어셈블리를 다시 작성할 때까지 모든 것이 잘됩니다. 로그의 오류는 다음과 같습니다코드 계약을 사용하여 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에서 사용하지 않도록 설정했지만 프로젝트 설정과 솔루션 설정이 아니므로 일반 솔루션 파일에서도 사용할 수 없습니다.

답변

4

알아 냈어. .NET 코드 계약 (모르는 사람들을위한 System.Diagnostics.Contracts 네임 스페이스)에는 코드에 포함 된 계약을 기반으로하는 코드의 정적 분석을 수행 할 수있는 기능이 있습니다. 설치된 코드 계약에 대한 Visual Studio 추가 기능이있는 경우 VS 프로젝트의 속성 페이지로 이동하여 코드 계약 탭을 클릭 할 수 있습니다. 정적 검사 섹션에는 캐시 결과라는 옵션이 있습니다. 이 기능을 사용하면 정적 검사는 SQL Server의 내장 데이터베이스를 사용하여 정적 코드 분석이 더 빨리 수행되도록 만듭니다 (이 파일은 컴파일 사이의 프로젝트 디렉토리에서 계속 유지됨). 이것은 빌드 서버가 SQL CE에 대해 갖는 종속성이며 응용 프로그램의 런타임 환경과 관련이 없습니다.

AppHarbor에 빌드 서버에 SQL CE가 없으므로 각 프로젝트의 코드 계약 속성을 변경하여 런타임 계약 검사 수행 및 디버그 및 릴리스 빌드 모두에 대한 정적 계약 검사 수행 릴리스 빌드의 정적 계약 검사 수행 섹션의 캐시 결과 옵션이 비활성화됩니다. AppHarbor은 Visual Studio에서 백그라운드 작업을 허용하지 않으므로 정적 계약 검사 수행 섹션의 Check in Background 옵션도 비활성화해야합니다.

왜 내가 유일한 사람인 것처럼 보이는지 System.Diagnostics.Contracts 네임 스페이스 (.NET Framework 자체는 제외)를 사용하는 경우?

+0

SQL Server에 대한 codecontracts 요구 사항을 변경하는 방법을 찾아 냈습니까? CE? System.Data.SqlClient를 사용하는 localdb를 사용하는 것이 좋습니다. 이것은 AppHarbor 사용자를 알아 주셔서 감사합니다. 감사합니다! –

+1

AppHarbor은 Visual Studio의 캐시 결과 기능을 빌드 서버에서 사용할 수 없으며 SQL CE를 사용합니다. 따라서 솔루션에서 해당 옵션을 해제하십시오 (두 번째 단락 참조). – gdoten

+0

아, 이해합니다. 감사. –

0

코드 계약에 익숙하지 않지만 단순히 SQL Server CE가 누락 된 것일 수 있습니다. 확인하기 위해 SQL Server CE를 사용하지 않는 프로젝트를 사용해 볼 수도 있습니다. NuGet을 사용하여 SQL Server CE를 추가하거나 AppHarbor이 빌드를 실행할 때 사용할 수 있도록 bin 배포 가능한 어셈블리로 추가하는 것이 좋습니다. this blog post에 더 많은 정보가 있습니다.

+0

행운의 SQL Server Compact 패키지를 사용해 보았습니다. 또한 나는 Release 빌드를 위해 "on"코드 계약을 남겨두고 Debug 빌드를 "off"로 설정했다. 이를 수정하고 솔루션을 빌드합니다."네임 스페이스 ViewModels"가 프리 컴파일 중에 존재하지 않지만 MSBuild 부분을 지나치는 것처럼 보입니다. 코드 계약이 작동하려면 SQL Server CE를 빌드 서버에 설치해야합니다. 이와 관련하여 우리는 어떻게 AppHarbor을 진행할 것입니까? – gdoten

+0

@gdoten 빌드 서버에 SQL Server CE를 설치하지는 않습니다. 우리는 사람들이 잘못된 버전과 무엇이 아닌 의존성이 설치되어있는 문제를 피할 수있을만큼 절대적으로 가능한 한 희박하게 유지하려고 노력합니다. SQL Server CE를 설치하지 않고 코드 계약 항목을 사용하려고 시도하는 것이 좋습니다. 로컬 컴퓨터에서 SQL Server CE를 제거하여 실험 해 볼 수 있습니다. – friism

+0

SQL Server CE를 사용하지 않습니다. .net Framework의 코드 계약 네임 스페이스가 솔루션 빌드의 일부로 수행됩니다 (런타임 환경에서는 사용하지 않습니다) – gdoten

0

코드 계약에서 생성되는 모든 오류 메시지에는 SQL Server CE 3.5.1을 설치해야한다는 메시지가 표시되지만 실제로는 3.5.2 버전을 설치해야합니다.

다른 모든 3.5.x 버전의 SQL Server CE를 제거하고 this을 설치하면 문제가 해결됩니다. 그리고 네, 64 비트 컴퓨터를 사용한다면 32 비트와 64 비트 버전이 정말로 필요합니다.