如何编写一个使用 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中的“MyDb”替换为“MyDbstaging”或“MyDbProduction”。
此外,为了能够重复使用此任务,而无需在每次修改后手动将 appSettings.json 文件中的值恢复为“MyDb”,我们可以添加另一个任务来恢复此值:
<Target Name="RestoreJsonFile" BeforeTargets="Build">
<Copy
SourceFiles="$(ProjectDir)\BackupJsonFile\appsettings.json"
DestinationFolder="$(ProjectDir)"
/>
</Target>
在备份文件夹BackupJsonFile中备份那个appSettings.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>
顺便说一句,如果替换 appSettings.json 中的 MyDb 的值不是您唯一的选择,如果为生产运行构建,您可以尝试使用 appSettings.production.json,而不是替换 appSettings.json 中的值。请参阅Config transformations in ASP.NET Core 和Appsettings.json configuration in ASP.Net Core Web API 更多详细信息。
希望这会有所帮助。