3

Visual Studio 2013 の使用

いくつかの異なる環境に展開できる 8 つの SSDT プロジェクトのセットがあります。ただし、各プロジェクトの高度な公開設定は同一であることを意図しています。現在、環境ごとに個別の発行プロファイルを作成しています。つまり、まったく同じ設定を使用して接続文字列が異なる最大 20 の発行プロファイルがあります。

データベースのパブリッシュ設定を微調整すること (SSDT にはまだ少し慣れていないため、定期的に発生します) は最も面倒ですが、できるように変換をパブリッシュ プロファイルに適用することができないため、これを回避する方法をまだ見つけていません。 ASP.NET プロジェクトの web.config ファイルに。Visual Studio SlowCheetah プラグインをインストールしてみましたが、発行プロファイルを右クリックしても変換を適用するオプションが表示されないため、SSDT プロジェクトでは機能しないようです。

DB を開発環境または QA 環境にデプロイするときに、接続の詳細を手動で入力することをチームに考えさせたくありません。20 個のほぼ同一の発行プロファイルを管理する必要がないように、マスター発行プロファイルを設定するか、共有設定のグループを指定する方法はありますか?

編集: SAS の回答を使用して、.sqlproj ファイルの次の XML をまとめることができました。

  <PropertyGroup>
    <PublishProfileDir>$(ProjectDir)Publish Profiles\</PublishProfileDir>
    <TemplatePublishProfile>$(PublishProfileDir)Baseline\publish.xml</TemplatePublishProfile>
  </PropertyGroup>
  <Target Name="CopyXml" AfterTargets="Build">
    <Copy SourceFiles="$(TemplatePublishProfile)" DestinationFolder="$(PublishProfileDir)Dev"/>
    <Copy SourceFiles="$(TemplatePublishProfile)" DestinationFolder="$(PublishProfileDir)Qa"/>
  </Target>
  <ItemGroup>
    <DevPublishUpdates Include="ConfigUpdates">
      <XPath>/msb:Project/msb:PropertyGroup/msb:TargetDatabaseName</XPath>
      <NewValue>CountyRecordsDev</NewValue>
    </DevPublishUpdates>
    <DevPublishUpdates Include="ConfigUpdates">
      <XPath>/msb:Project/msb:PropertyGroup/msb:DeployScriptFileName</XPath>
      <NewValue>CountyRecords.Dev.Sql</NewValue>
    </DevPublishUpdates>
  </ItemGroup>
  <Target Name="UpdateXml" AfterTargets="CopyXml">
    <Message Text="Editing Derived Xml Publish Profiles" Importance="high" />
    <XmlPoke Namespaces="&lt;NamespacePrefix='msb'Uri='http://schemas.microsoft.com/developer/msbuild/2003'/&gt;"
        XmlInputath="$(PublishProfileDir)Dev\publish.xml" 
        Query="%(DevPublishUpdates.XPath)" 
        Value="%(DevPublishUpdates.NewValue)" />
  </Target>

唯一の欠点は、ある変換が別の変換を上書きしないようにするために、すべての公開プロファイル用に別のフォルダーが必要なように思われることです。既存のファイルを単純に上書きする方法を見つけることができなかったようです。XmlPoke の場合、namespaces 属性は操作にとって重要です。このプロセスの詳細については、Sayed Ibrahim Hashimi によるこのブログ投稿を参照してください。

4

1 に答える 1

2

すべてのターゲットに対して、発行の前段階として自動的にコピーされるテンプレート xml ファイルを使用しているため、変更はテンプレートで行うだけで済みます。パブリッシュ xml ファイルが作成されると、ターゲット サーバー名は動的に置き換えられます。このために、xaml も変更する必要がありました。共通のプロジェクト ファイルで Copy タグと XMLPoke タグを使用し、プロジェクト ファイルに含まれています。多少の手間はかかりますが、問題なく動作します。

編集:説明するために以下のコードを貼り付けました。これは元のコードの一部にすぎませんが、すべての人が始めるのに十分であることを願っています:

共通ファイル (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>

次に、ターゲットサーバーごとにこれを繰り返し呼び出します。

<Target Name="CreateAllPublishXMLFiles">
 <MSBuild Projects="$(MSBuildProjectFile)" Targets="CreatePublishXMLFile" Properties="TargetServerParam=OURSERVER1" />
 <MSBuild Projects="$(MSBuildProjectFile)" Targets="CreatePublishXMLFile" Properties="TargetServerParam=OURSERVER2" />
</Target>

各プロジェクト ファイルに、共通コードを含めて呼び出します。

<Import Project="$(SolutionDir)SQLCommonInclude.proj" />
<Target Name="BeforeBuild" DependsOnTargets="CreateAllPublishXMLFiles">

次に、デプロイ後のスクリプトで、拡張プロパティを次のように設定します。

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)';
于 2015-01-13T14:38:26.117 に答える