2016-11-22 280 views
0

我有一個數據庫(SQL Server 2008)項目(.sqlproj)(2015)解決方案,我想寫這個數據庫項目的集成測試。我需要爲每個測試重新創建數據庫,但我似乎無法使用Microsoft.Build來使其工作。從集成測試的代碼構建和發佈sqlproj

在我的測試組件,我引用如下:

<Reference Include="Microsoft.Build, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" /> 
<Reference Include="Microsoft.Build.Framework, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" /> 
<Reference Include="Microsoft.Build.Tasks.Core, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" /> 
<Reference Include="Microsoft.Build.Utilities.Core, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" /> 

我發佈配置文件用於測試:

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup> 
    <IncludeCompositeObjects>True</IncludeCompositeObjects> 
    <TargetDatabaseName>OnTime</TargetDatabaseName> 
    <DeployScriptFileName>OnTime.Database.sql</DeployScriptFileName> 
    <TargetConnectionString>Data Source=.\SQLX;Integrated Security=True;Persist Security Info=False;Pooling=False;MultipleActiveResultSets=False;Connect Timeout=60;Encrypt=False;TrustServerCertificate=True</TargetConnectionString> 
    <BlockOnPossibleDataLoss>True</BlockOnPossibleDataLoss> 
    <CreateNewDatabase>True</CreateNewDatabase> 
    <ProfileVersionNumber>1</ProfileVersionNumber> 
    </PropertyGroup> 
</Project> 

和代碼我用來做設置:

[OneTimeSetUp] 
public void Setup() 
{ 
    var connectionString = ConfigurationManager.ConnectionStrings["OnTime"].ConnectionString; 

    //var directory = Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName; 

    ILogger logger = new DebugLogger(); 

    // Set up properties. 
    //https://msdn.microsoft.com/en-us/library/microsoft.data.tools.schema.tasks.sql.sqlpublishtask(v=vs.103).aspx 
    var projects = ProjectCollection.GlobalProjectCollection; 
    projects.SetGlobalProperty("Configuration", "Debug"); 
    projects.SetGlobalProperty("CreateNewDatabase", "True"); 
    projects.SetGlobalProperty("VisualStudioVersion", "14.0"); 
    projects.SetGlobalProperty("SqlPublishProfilePath", @"C:\Users\SNUY\Documents\Code\OnTime\OnTime.Database\Publish\OnTime.Database.publish.SQLEXPRESS.xml"); 
    // Load and build project. 
    var dbProject = ProjectCollection.GlobalProjectCollection.LoadProject(@"C:\Users\SNUY\Documents\Code\OnTime\OnTime.Database\OnTime.Database.sqlproj"); 
    var result = dbProject.Build(new[] { "Build", "Publish" }, new[] { logger }); 
} 

我從DebugLogger收到的輸出:(僅從發佈任務輸出)

Build started. 
Project "OnTime.Database.sqlproj" (Publish target(s)): 
Building with tools version "14.0". 
Target "CheckRequiredProperties" in file "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\SSDT\Microsoft.Data.Tools.Schema.SqlTasks.targets" from project "C:\Users\SNUY\Documents\Code\OnTime\OnTime.Database\OnTime.Database.sqlproj" (entry point): 
Done building target "CheckRequiredProperties" in project "OnTime.Database.sqlproj". 
Target "_CheckForInvalidConfigurationAndPlatform" in file "C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.Common.CurrentVersion.targets" from project "C:\Users\SNUY\Documents\Code\OnTime\OnTime.Database\OnTime.Database.sqlproj" (entry point): 
Task "Error" skipped, due to false condition; ('$(_InvalidConfigurationError)' == 'true') was evaluated as ('' == 'true'). 
Task "Warning" skipped, due to false condition; ('$(_InvalidConfigurationWarning)' == 'true') was evaluated as ('' == 'true'). 
'vstest.executionengine.x86.exe' (CLR v4.0.30319: test-domain-OnTime.Data.Test.dll): Loaded 'C:\windows\Microsoft.Net\assembly\GAC_MSIL\Microsoft.Build.Tasks.Core\v4.0_14.0.0.0__b03f5f7f11d50a3a\Microsoft.Build.Tasks.Core.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled. 
Using "Message" task from assembly "Microsoft.Build.Tasks.Core, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a". 
Task "Message" 
Configuration=Debug 
Done executing task "Message". 
Task "Message" 
Platform=AnyCPU 
Done executing task "Message". 
Task "Error" skipped, due to false condition; ('$(OutDir)' != '' and !HasTrailingSlash('$(OutDir)')) was evaluated as ('bin\Debug\' != '' and !HasTrailingSlash('bin\Debug\')). 
Task "Error" skipped, due to false condition; ('$(BaseIntermediateOutputPath)' != '' and !HasTrailingSlash('$(BaseIntermediateOutputPath)')) was evaluated as ('obj\' != '' and !HasTrailingSlash('obj\')). 
Task "Error" skipped, due to false condition; ('$(IntermediateOutputPath)' != '' and !HasTrailingSlash('$(IntermediateOutputPath)')) was evaluated as ('obj\Debug\' != '' and !HasTrailingSlash('obj\Debug\')). 
Done building target "_CheckForInvalidConfigurationAndPlatform" in project "OnTime.Database.sqlproj". 
Target "BeforePublish" in file "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\SSDT\Microsoft.Data.Tools.Schema.SqlTasks.targets" from project "C:\Users\SNUY\Documents\Code\OnTime\OnTime.Database\OnTime.Database.sqlproj" (target "Publish" depends on it): 
Done building target "BeforePublish" in project "OnTime.Database.sqlproj". 
Target "PrePublishEvent" skipped, due to false condition; ('$(PrePublishEvent)'!='' And Exists($(TargetDir))) was evaluated as (''!='' And Exists(C:\Users\SNUY\Documents\Code\OnTime\OnTime.Database\bin\Debug\)). 
Target "_SetupSqlPublishInputs" in file "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\SSDT\Microsoft.Data.Tools.Schema.SqlTasks.targets" from project "C:\Users\SNUY\Documents\Code\OnTime\OnTime.Database\OnTime.Database.sqlproj" (target "SqlPublish" depends on it): 
Done building target "_SetupSqlPublishInputs" in project "OnTime.Database.sqlproj". 
Target "_SetupSqlPublishOutputs" in file "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\SSDT\Microsoft.Data.Tools.Schema.SqlTasks.targets" from project "C:\Users\SNUY\Documents\Code\OnTime\OnTime.Database\OnTime.Database.sqlproj" (target "SqlPublish" depends on it): 
Done building target "_SetupSqlPublishOutputs" in project "OnTime.Database.sqlproj". 
Target "SqlPublish" in file "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\SSDT\Microsoft.Data.Tools.Schema.SqlTasks.targets" from project "C:\Users\SNUY\Documents\Code\OnTime\OnTime.Database\OnTime.Database.sqlproj" (target "Publish" depends on it): 
Building target "SqlPublish" completely. 
Input file "ForceScriptRecalculation.txt" does not exist. 
'vstest.executionengine.x86.exe' (CLR v4.0.30319: test-domain-OnTime.Data.Test.dll): Loaded 'C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\SQLDB\Dac\130\Microsoft.Data.Tools.Schema.Tasks.Sql.dll'. Cannot find or open the PDB file. 
'vstest.executionengine.x86.exe' (CLR v4.0.30319: test-domain-OnTime.Data.Test.dll): Loaded 'C:\windows\Microsoft.Net\assembly\GAC_MSIL\Microsoft.Build.Utilities.v4.0\v4.0_4.0.0.0__b03f5f7f11d50a3a\Microsoft.Build.Utilities.v4.0.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled. 
'vstest.executionengine.x86.exe' (CLR v4.0.30319: test-domain-OnTime.Data.Test.dll): Loaded 'C:\windows\Microsoft.Net\assembly\GAC_MSIL\Microsoft.Build.Framework\v4.0_4.0.0.0__b03f5f7f11d50a3a\Microsoft.Build.Framework.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled. 
Using "SqlPublishTask" task from assembly "C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\\Extensions\Microsoft\SQLDB\Dac\130\Microsoft.Data.Tools.Schema.Tasks.Sql.dll". 
Task "SqlPublishTask" 
'vstest.executionengine.x86.exe' (CLR v4.0.30319: test-domain-OnTime.Data.Test.dll): Loaded 'C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\SQLDB\Dac\130\Microsoft.Data.Tools.Schema.Utilities.Sql.dll'. Cannot find or open the PDB file. 
'vstest.executionengine.x86.exe' (CLR v4.0.30319: test-domain-OnTime.Data.Test.dll): Loaded 'C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\SQLDB\Dac\130\Microsoft.Data.Tools.Schema.Sql.dll'. Cannot find or open the PDB file. 
'vstest.executionengine.x86.exe' (CLR v4.0.30319: test-domain-OnTime.Data.Test.dll): Loaded 'C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\SQLDB\Dac\130\Microsoft.Data.Tools.Utilities.dll'. Cannot find or open the PDB file. 
'vstest.executionengine.x86.exe' (CLR v4.0.30319: test-domain-OnTime.Data.Test.dll): Loaded 'C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\SQLDB\Dac\130\Microsoft.SqlServer.Dac.Extensions.dll'. Cannot find or open the PDB file. 
The "SqlPublishTask" task could not be instantiated from the assembly "C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\\Extensions\Microsoft\SQLDB\Dac\130\Microsoft.Data.Tools.Schema.Tasks.Sql.dll". Please verify the task assembly has been built using the same version of the Microsoft.Build.Framework assembly as the one installed on your computer and that your host application is not missing a binding redirect for Microsoft.Build.Framework. Unable to cast object of type 'Microsoft.Data.Tools.Schema.Tasks.Sql.SqlPublishTask' to type 'Microsoft.Build.Framework.ITask'. 
The "SqlPublishTask" task has been declared or used incorrectly, or failed during construction. Check the spelling of the task name and the assembly name. 
The thread 0x34b8 has exited with code 0 (0x0). 
Done executing task "SqlPublishTask" -- FAILED. 
Done building target "SqlPublish" in project "OnTime.Database.sqlproj" -- FAILED. 
Done building project "OnTime.Database.sqlproj" -- FAILED. 
Build FAILED. 

使用的MSBuild從命令行運行工作正常

msbuild /t:Build;Publish /p:SqlPublishProfilePath=Publish\OnTime.Database.publish.SQLEXPRESS.xml 

sqlproj文件內容:

<?xml version="1.0" encoding="utf-8"?> 
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0"> 
    <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> 
    <PropertyGroup> 
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> 
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> 
    <Name>OnTime.Database</Name> 
    <SchemaVersion>2.0</SchemaVersion> 
    <ProjectVersion>4.1</ProjectVersion> 
    <ProjectGuid>{7ce126e0-b091-428f-8983-0c3db87922ad}</ProjectGuid> 
    <DSP>Microsoft.Data.Tools.Schema.Sql.Sql100DatabaseSchemaProvider</DSP> 
    <OutputType>Database</OutputType> 
    <RootPath> 
    </RootPath> 
    <RootNamespace>OnTime.Database</RootNamespace> 
    <AssemblyName>OnTime.Database</AssemblyName> 
    <ModelCollation>1033, CI</ModelCollation> 
    <DefaultFileStructure>BySchemaAndSchemaType</DefaultFileStructure> 
    <DeployToDatabase>True</DeployToDatabase> 
    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion> 
    <TargetLanguage>CS</TargetLanguage> 
    <AppDesignerFolder>Properties</AppDesignerFolder> 
    <SqlServerVerification>False</SqlServerVerification> 
    <IncludeCompositeObjects>True</IncludeCompositeObjects> 
    <TargetDatabaseSet>True</TargetDatabaseSet> 
    <DefaultSchema>OnTime</DefaultSchema> 
    <GenerateCreateScript>True</GenerateCreateScript> 
    <IsChangeTrackingOn>True</IsChangeTrackingOn> 
    <ChangeTrackingRetentionPeriod>7</ChangeTrackingRetentionPeriod> 
    <SccProjectName>SAK</SccProjectName> 
    <SccProvider>SAK</SccProvider> 
    <SccAuxPath>SAK</SccAuxPath> 
    <SccLocalPath>SAK</SccLocalPath> 
    </PropertyGroup> 
    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> 
    <OutputPath>bin\Release\</OutputPath> 
    <BuildScriptName>$(MSBuildProjectName).sql</BuildScriptName> 
    <TreatWarningsAsErrors>False</TreatWarningsAsErrors> 
    <DebugType>pdbonly</DebugType> 
    <Optimize>true</Optimize> 
    <DefineDebug>false</DefineDebug> 
    <DefineTrace>true</DefineTrace> 
    <ErrorReport>prompt</ErrorReport> 
    <WarningLevel>4</WarningLevel> 
    </PropertyGroup> 
    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> 
    <OutputPath>bin\Debug\</OutputPath> 
    <BuildScriptName>$(MSBuildProjectName).sql</BuildScriptName> 
    <TreatWarningsAsErrors>false</TreatWarningsAsErrors> 
    <DebugSymbols>true</DebugSymbols> 
    <DebugType>full</DebugType> 
    <Optimize>false</Optimize> 
    <DefineDebug>true</DefineDebug> 
    <DefineTrace>true</DefineTrace> 
    <ErrorReport>prompt</ErrorReport> 
    <WarningLevel>4</WarningLevel> 
    </PropertyGroup> 
    <PropertyGroup> 
    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">11.0</VisualStudioVersion> 
    <!-- Default to the v11.0 targets path if the targets file for the current VS version is not found --> 
    <SSDTExists Condition="Exists('$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\SSDT\Microsoft.Data.Tools.Schema.SqlTasks.targets')">True</SSDTExists> 
    <VisualStudioVersion Condition="'$(SSDTExists)' == ''">11.0</VisualStudioVersion> 
    </PropertyGroup> 
    <Import Condition="'$(SQLDBExtensionsRefPath)' != ''" Project="$(SQLDBExtensionsRefPath)\Microsoft.Data.Tools.Schema.SqlTasks.targets" /> 
    <Import Condition="'$(SQLDBExtensionsRefPath)' == ''" Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\SSDT\Microsoft.Data.Tools.Schema.SqlTasks.targets" /> 
    <ItemGroup> 
    <Folder Include="Properties" /> 
    <Folder Include="Tables" /> 
    <Folder Include="StoredProcedures" /> 
    <Folder Include="Views" /> 
    <Folder Include="Publish" /> 
    <Folder Include="Scripts" /> 
    </ItemGroup> 
    <ItemGroup> 
    <Build Include="Schema.sql" /> 
    <Build Include="Tables\Contract.sql" /> 
    <Build Include="Tables\Customer.sql" /> 
    <Build Include="Tables\Log.sql" /> 
    <Build Include="Tables\User.sql" /> 
    <Build Include="StoredProcedures\Report.sql" /> 
    <Build Include="Views\LogDetailView.sql" /> 
    <Build Include="Login.sql" /> 
    <Build Include="User.sql" /> 
    </ItemGroup> 
    <ItemGroup> 
    <PostDeploy Include="Scripts\Seed.sql" /> 
    </ItemGroup> 
    <ItemGroup> 
    <None Include="Publish\OnTime.Database.publish.SQLEXPRESS.xml" /> 
    </ItemGroup> 
</Project> 

這是我的主要問題,我認爲:

的 「SqlPublishTask」 任務無法從程序集實例化 「C:\ Program Files(x86)\ Micro軟Visual Studio 14.0 \ Common7 \ IDE \ Extensions \ Microsoft \ SQLDB \ Dac \ 130 \ Microsoft.Data.Tools.Schema.Tasks.Sql.dll「。 請驗證任務程序集是否使用Microsoft.Build.Framework程序集的相同版本 與您的 計算機上安裝的版本相同,並且您的主機應用程序不會錯過Microsoft.Build.Framework的重定向 重定向。無法投射 'Microsoft.Data.Tools.Schema.Tasks.Sql.SqlPublishTask'類型的對象來鍵入 'Microsoft.Build.Framework.ITask'。

+0

代碼片段似乎沒問題,我通過使用代碼片段創建控制檯應用程序,它的工作原理。請通過Onedrive分享一個簡單的演示 –

+0

該代碼位於TFS(visualstudio.com)上,向我發送您的outlook電子郵件地址,我會邀請您。 – grmbl

+0

看我的個人資料找到我的Twitter用戶並與我聯繫。 – grmbl

回答

0

在收到輸出後,我開始查看引用的Microsoft.Build程序集。看來我有多個安裝。

一定要添加以下內容:

C:\ Program Files文件(x86)的\參考 大會\微軟\ Framework.NETFramework \ v4.5.2 \ Microsoft.Build.dll

Ç :\ Program Files文件(x86)的\參考 大會\微軟\ Framework.NETFramework \ v4.5.2 \ Microsoft.Build.Framework.dll

其餘的被安裝在C:\Program Files (x86)\Reference Assemblies\Microsoft\MSBuild\v14.0(版本14.0.25420。1)

0

當你沒有在cmdline中傳遞「Configuration」並且有可能啓動,但在你聲明「Configuration」的c#代碼中,似乎有些默認運行。在sqlproj上很難說沒有眼睛。

+0

已添加sqlproj內容 – grmbl

2

我已經下載了你的項目和複製在我的身邊你的問題,你加錯引用(Microsoft.Build,Microsoft.Build.Framework,Microsoft.Build.Tasks.Core,Microsoft.Build.Utilities 。核心)。請刪除參考,然後添加.NetFramework 4.5.2的參考。 enter image description here

我將項目上傳到OneDrive,請檢查它。 https://1drv.ms/u/s!AlvaNEnglADDdiwzuwrNRtI_6n0

+0

感謝您的時間和答案,但我昨天也想到了這一點,請參閱我自己的回答。 :) – grmbl