如何编写一个任务,使用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>
上述示例将“
MyDb
”替换为“
MyDbstaging
”或“
MyDbProduction
”在文件
appSettings.json
中。
此外,为了能够重复使用此任务,而无需在每次修改后手动恢复appSettings.json
文件中的值为“MyDb
”,我们可以添加另一个任务来恢复这个值:
<Target Name="RestoreJsonFile" BeforeTargets="Build">
<Copy
SourceFiles="$(ProjectDir)\BackupJsonFile\appsettings.json"
DestinationFolder="$(ProjectDir)"
/>
</Target>
将appSettings.json
文件备份到BackupJsonFile
文件夹中,然后将其替换为已修改的文件。
因此,最终的自定义任务应该是:
<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
中的值。有关详细信息,请参见ASP.NET Core中的配置转换和ASP.Net Core Web API中的Appsettings.json配置。
希望这可以帮助到您。
"
替换双引号即可。对于第二个问题,恐怕不行。因为条件是'$(Configuration)'=='Production'
,这个值无法传递到发布过程中,只能由构建过程支持。 - Leo Liu