MSBuild 在发布数据库时忽略 p-Switch
MSBuild ignores p-Switch when publishing database
我已经在 VS 2015 中通过 SSDT 创建了一个针对 SQL Azure V12 服务器的发布配置文件,现在我想使用控制台发布数据库。我正在使用以下命令:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe
/t:Publish
/p:TargetDatabaseName=NEWDBNAME
/p:SqlPublishProfilePath="PublishProfiles\test.publish.xml"
"{PATH_TO_MY_SSDT\{PROJECTNAME}.sqlproj"
我的个人资料如下所示(花括号在这里只是实际值的占位符):
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<IncludeCompositeObjects>True</IncludeCompositeObjects>
<TargetDatabaseName>DBNAME</TargetDatabaseName>
<DeployScriptFileName>Data.Database.sql</DeployScriptFileName>
<BlockOnPossibleDataLoss>True</BlockOnPossibleDataLoss>
<CreateNewDatabase>True</CreateNewDatabase>
<ProfileVersionNumber>1</ProfileVersionNumber>
<TargetConnectionString>Data Source={SERVER};Persist Security Info=True;User ID={USER};Password={PW};Pooling=False</TargetConnectionString>
</PropertyGroup>
<ItemGroup>
<SqlCmdVariable Include="BaseData">
<Value>1</Value>
</SqlCmdVariable>
<SqlCmdVariable Include="SampleData">
<Value>1</Value>
</SqlCmdVariable>
</ItemGroup>
</Project>
这每次都会创建一个数据库 "DBNAME",而不是用值 "NEWDBNAME" 替换 属性 TargetDatabaseName
。其他一切正常。
为什么 msbuild 会保留 属性 不变?
编辑:
我做了一些测试并尝试了以下方法(在 Christian K.s 评论之后):
测试 1:添加诊断
C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe
/t:Publish
/p:TargetDatabaseName=NEWDBNAME
/p:SqlPublishProfilePath="PublishProfiles\test.publish.xml"
"{PATH_TO_MY_SSDT\{PROJECTNAME}.sqlproj"
/v:diag
/fl
输出中有一节显示参数。这是屏幕截图:
测试 2:更改 UpdateDatabase 以进行测试
C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe
/t:Publish
/p:TargetDatabaseName=NEWDBNAME
/p:SqlPublishProfilePath="PublishProfiles\test.publish.xml"
/p:UpdateDatabase=false
"{PATH_TO_MY_SSDT\{PROJECTNAME}.sqlproj"
/v:diag
/fl
如您所见,UpdateDatabase
已正确更改,TargetDatabaseName
未出现在属性列表中。
调用 exec 任务真的要简单得多 sqlpackage.exe - 我将 sqlpackage 文件夹 MSSQL\VER\DAC\bin 检查到我的解决方案中,这样我就可以使用构建文件夹中的相对路径,你可以部署从有或没有 SQL 的任何服务器。
我得到了解决方案。我只是将我的发布配置文件中的 CreateNewDatabase
设置为 false
并且它起作用了。
Edit: 它只工作一次,因为在那之后这个过程被简单地跳过了,因为数据库已经存在。现在的解决方案是在我按照 Kris 在他的评论中建议的代码通过代码执行它之前编辑 publish.xml 。
这是 SQL 服务器与 SQL Azure 之间不兼容的另一个示例,这在我看来很烦人。
我已经在 VS 2015 中通过 SSDT 创建了一个针对 SQL Azure V12 服务器的发布配置文件,现在我想使用控制台发布数据库。我正在使用以下命令:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe
/t:Publish
/p:TargetDatabaseName=NEWDBNAME
/p:SqlPublishProfilePath="PublishProfiles\test.publish.xml"
"{PATH_TO_MY_SSDT\{PROJECTNAME}.sqlproj"
我的个人资料如下所示(花括号在这里只是实际值的占位符):
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<IncludeCompositeObjects>True</IncludeCompositeObjects>
<TargetDatabaseName>DBNAME</TargetDatabaseName>
<DeployScriptFileName>Data.Database.sql</DeployScriptFileName>
<BlockOnPossibleDataLoss>True</BlockOnPossibleDataLoss>
<CreateNewDatabase>True</CreateNewDatabase>
<ProfileVersionNumber>1</ProfileVersionNumber>
<TargetConnectionString>Data Source={SERVER};Persist Security Info=True;User ID={USER};Password={PW};Pooling=False</TargetConnectionString>
</PropertyGroup>
<ItemGroup>
<SqlCmdVariable Include="BaseData">
<Value>1</Value>
</SqlCmdVariable>
<SqlCmdVariable Include="SampleData">
<Value>1</Value>
</SqlCmdVariable>
</ItemGroup>
</Project>
这每次都会创建一个数据库 "DBNAME",而不是用值 "NEWDBNAME" 替换 属性 TargetDatabaseName
。其他一切正常。
为什么 msbuild 会保留 属性 不变?
编辑:
我做了一些测试并尝试了以下方法(在 Christian K.s 评论之后):
测试 1:添加诊断
C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe
/t:Publish
/p:TargetDatabaseName=NEWDBNAME
/p:SqlPublishProfilePath="PublishProfiles\test.publish.xml"
"{PATH_TO_MY_SSDT\{PROJECTNAME}.sqlproj"
/v:diag
/fl
输出中有一节显示参数。这是屏幕截图:
测试 2:更改 UpdateDatabase 以进行测试
C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe
/t:Publish
/p:TargetDatabaseName=NEWDBNAME
/p:SqlPublishProfilePath="PublishProfiles\test.publish.xml"
/p:UpdateDatabase=false
"{PATH_TO_MY_SSDT\{PROJECTNAME}.sqlproj"
/v:diag
/fl
如您所见,UpdateDatabase
已正确更改,TargetDatabaseName
未出现在属性列表中。
调用 exec 任务真的要简单得多 sqlpackage.exe - 我将 sqlpackage 文件夹 MSSQL\VER\DAC\bin 检查到我的解决方案中,这样我就可以使用构建文件夹中的相对路径,你可以部署从有或没有 SQL 的任何服务器。
我得到了解决方案。我只是将我的发布配置文件中的 CreateNewDatabase
设置为 false
并且它起作用了。
Edit: 它只工作一次,因为在那之后这个过程被简单地跳过了,因为数据库已经存在。现在的解决方案是在我按照 Kris 在他的评论中建议的代码通过代码执行它之前编辑 publish.xml 。
这是 SQL 服务器与 SQL Azure 之间不兼容的另一个示例,这在我看来很烦人。