We are using a template xml file that is copied automagically as a pre-step in the publish, for all our targets, so any changes need only be mande in the template. The target server name is replaced dynamically as the publish xml files are created. We also had to modify the xaml for this. We use Copy and XMLPoke tags in common proj-file thar is included in our proj-files. It takes some work, but works fine.
Edit: I have pasted in some code below to try to explain, it is only part of the original but I hope it is enough to get everyone started:
This part of what is in our common file (SQLCommonInclude.proj):
<Target Name="CreatePublishXMLFile">
<PropertyGroup>
<VersionNumber Condition="'$(VersionNumber)'==''">Local Build</VersionNumber>
<CurrentDate>$([System.DateTime]::Now.ToString(yyyy-MM-dd HH:mm:ss))</CurrentDate>
<SqlPublishProfilePath Condition="'$(SqlPublishProfilePath)'==''">Publish$(TargetServerParam).publish.xml</SqlPublishProfilePath>
<TargetXMLFile>$(ProjectDir)Publish$(TargetServerParam).publish.xml</TargetXMLFile>
<ChangeSets Condition="'$(ChangeSets)'==''">Unknown</ChangeSets>
</PropertyGroup>
<XmlPoke XmlInputPath="$(TargetXMLFile)" Query="/*[local-name()='Project']/*[local-name()='PropertyGroup']/*[local-name()='TargetConnectionString']" Value="Data Source=$(TargetServerParam)%3BIntegrated Security=True%3BPooling=False" />
<XmlPoke XmlInputPath="$(TargetXMLFile)" Query="/*[local-name()='Project']/*[local-name()='PropertyGroup']/*[local-name()='TargetDatabaseName']" Value="$(ProjectName)" />
<XmlPoke XmlInputPath="$(TargetXMLFile)" Query="/*[local-name()='Project']/*[local-name()='ItemGroup']/*[local-name()='SqlCmdVariable'][@Include='ChangeSets']/*[local-name()='Value']" Value="$(ChangeSets)" />
</Target>
Then call this repeatedly, for each target server:
<Target Name="CreateAllPublishXMLFiles">
<MSBuild Projects="$(MSBuildProjectFile)" Targets="CreatePublishXMLFile" Properties="TargetServerParam=OURSERVER1" />
<MSBuild Projects="$(MSBuildProjectFile)" Targets="CreatePublishXMLFile" Properties="TargetServerParam=OURSERVER2" />
</Target>
In each Project file we include and call the common code:
<Import Project="$(SolutionDir)SQLCommonInclude.proj" />
<Target Name="BeforeBuild" DependsOnTargets="CreateAllPublishXMLFiles">
Then, In a Post-deployment Script we set the Extended Properties like this:
IF NOT EXISTS (SELECT NULL FROM SYS.EXTENDED_PROPERTIES WHERE class_desc = 'DATABASE' AND name = 'SSDT ChangeSets')
EXEC sp_addextendedproperty @name = N'SSDT ChangeSets', @value = '';
EXEC sp_updateextendedproperty @name = N'SSDT ChangeSets', @value = '$(ChangeSets)';
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…