2017-11-29 7 views
0

私は2つの異なる環境、1)ステージング、2)生産に展開したいASP .NETコアアプリケーションを持っています。私は、データベースのconnectionStringsが含まれている私のプロジェクトでは、以下のファイルを持っている:MSBuildを使用してappSettings.json変換を実行するタスクを作成する方法は?

appSettings.json 
appSettings.staging.json 
appSettings.production.json 

は、ConnectionStringの名前が「MYDB」である、と言うことができます。 appSettings.jsonのMyDbの値をappSettings.production.jsonの値をProductionの値で置き換え、appSettings.staging.jsonの値をStagingのために実行した場合の値に置き換えることができます。

どうすればいいですか?ステップバイステップの例は素晴らしいでしょう。

答えて

0

MSBuildを使用してappSettings.json変換を実行するタスクの作成方法

カスタムタスクReplaceFileTextをプロジェクトファイルに追加できます。

これを行うには、プロジェクトをアンロードします。そして、プロジェクトの最後に、ちょうど終了タグ</Project>前に、スクリプト以下の場所:

<UsingTask TaskName="ReplaceFileText" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll"> 
    <ParameterGroup> 
     <InputFilename ParameterType="System.String" Required="true" /> 
     <OutputFilename ParameterType="System.String" Required="true" /> 
     <MatchExpression ParameterType="System.String" Required="true" /> 
     <ReplacementText ParameterType="System.String" Required="true" /> 
    </ParameterGroup> 
    <Task> 
     <Reference Include="System.Core" /> 
     <Using Namespace="System" /> 
     <Using Namespace="System.IO" /> 
     <Using Namespace="System.Text.RegularExpressions" /> 
     <Code Type="Fragment" Language="cs"> 
     <![CDATA[ 
      File.WriteAllText(
       OutputFilename, 
       Regex.Replace(File.ReadAllText(InputFilename), MatchExpression, ReplacementText) 
       ); 
      ]]> 
     </Code> 
    </Task> 
    </UsingTask> 

    <Target Name="TransformsWithProduction" Condition="'$(Configuration)'=='Production'" AfterTargets="Build"> 
    <ReplaceFileText 
     InputFilename="$(ProjectDir)appsettings.json" 
     OutputFilename="$(ProjectDir)appsettings.json" 
     MatchExpression="MyDb" 
     ReplacementText="MyDbProduction" /> 
    </Target> 

    <Target Name="TransformsWithProduction" Condition="'$(Configuration)'=='staging'" AfterTargets="Build"> 
    <ReplaceFileText 
     InputFilename="$(ProjectDir)appsettings.json" 
     OutputFilename="$(ProjectDir)appsettings.json" 
     MatchExpression="MyDb" 
     ReplacementText="MyDbstaging" /> 
    </Target> 

上記の例では、ファイルappSettings.jsonに「MyDbstaging」または「MyDbProduction」と「MyDb」を置き換えます。ほかに

、手動で各修正後appSettings.jsonファイル内の値に「MyDb」を復元することなく、このタスクを再利用できるようにするために、我々は、この値を復元するために別のタスク追加することができます。

<Target Name="RestoreJsonFile" BeforeTargets="Build"> 
    <Copy 
      SourceFiles="$(ProjectDir)\BackupJsonFile\appsettings.json" 
      DestinationFolder="$(ProjectDir)" 
     /> 
    </Target> 

バックアップフォルダBackupJsonFileappSettings.jsonをバックアップしてから、コピーして修正済みのファイルを置き換えます。

だから、最終的なカスタムタスクは次のようになります。

<UsingTask TaskName="ReplaceFileText" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll"> 
    <ParameterGroup> 
     <InputFilename ParameterType="System.String" Required="true" /> 
     <OutputFilename ParameterType="System.String" Required="true" /> 
     <MatchExpression ParameterType="System.String" Required="true" /> 
     <ReplacementText ParameterType="System.String" Required="true" /> 
    </ParameterGroup> 
    <Task> 
     <Reference Include="System.Core" /> 
     <Using Namespace="System" /> 
     <Using Namespace="System.IO" /> 
     <Using Namespace="System.Text.RegularExpressions" /> 
     <Code Type="Fragment" Language="cs"> 
     <![CDATA[ 
      File.WriteAllText(
       OutputFilename, 
       Regex.Replace(File.ReadAllText(InputFilename), MatchExpression, ReplacementText) 
       ); 
      ]]> 
     </Code> 
    </Task> 
    </UsingTask> 

    <Target Name="RestoreJsonFile" BeforeTargets="Build"> 
    <Copy 
      SourceFiles="$(ProjectDir)\BackupJsonFile\appsettings.json" 
      DestinationFolder="$(ProjectDir)" 
     /> 
    </Target> 

    <Target Name="TransformsWithProduction" Condition="'$(Configuration)'=='Production'" AfterTargets="RestoreJsonFile"> 
    <ReplaceFileText 
     InputFilename="$(ProjectDir)appsettings.json" 
     OutputFilename="$(ProjectDir)appsettings.json" 
     MatchExpression="MyDb" 
     ReplacementText="MyDbProduction" /> 
    </Target> 

    <Target Name="TransformsWithstaging" Condition="'$(Configuration)'=='staging'" AfterTargets="RestoreJsonFile"> 
    <ReplaceFileText 
     InputFilename="$(ProjectDir)appsettings.json" 
     OutputFilename="$(ProjectDir)appsettings.json" 
     MatchExpression="MyDb" 
     ReplacementText="MyDbstaging" /> 
    </Target> 

enter image description here

ところで、ビルドがある場合は、あなたの唯一のオプションは、あなたがappSettings.production.jsonを使用しようとすることができていないappSettings.jsonにMYDBの値を交換する場合appSettings.jsonの値を置き換えるのではなく、Productionのために実行します。詳細情報はConfig transformations in ASP.NET CoreAppsettings.json configuration in ASP.Net Core Web APIを参照してください。

これが役に立ちます。

+0

上記の手順を実行した後、私はアクティブなソリューション構成を「プロダクション」に変更してプロジェクトを構築し、appSettings.jsonファイルに変更は見られませんでした。 –

+0

@Dev_Net、それは私のせいです。 'TransformsWithProduction'でターゲット名を二重にコピーしました。これを更新して確認でき、私の側でテストしました。うまくいきます。 –

+0

ありがとうレオ、何の問題もなく働いた。いくつかのことがあります:1)appSettings.json内の 'connectionStrings'というセクション全体を、appSettings.Production.jsonまたはappSettings.Staging.jsonの同じセクションに置き換えるにはどうすればよいですか? 2)これは、コードを公開しなければならないときにのみ、これらのビルドタスクを実行することが可能であり、各ビルドではできません。 –

関連する問題