在SlowCheetah中,我希望不使用转换文件中的硬编码值来转换配置文件的某些元素,而是使用另一个文件的内容或(最好是)从代码生成的值来转换。例如,在通过代码生成值的情况下,请执行以下操作:
{
"someSettings": {
"@jdt.replace": {
"timeTokenAtBuild": "1f3ac2"
}
}
}
...我想要这样的东西:
{
"someSettings": {
"@jdt.replace": {
"timeTokenAtBuild": [MyUtilitiesLibrary.GetCurrentTimeToken()]
}
}
}
从类似PowerShell脚本的值中获取值也可以。我现在可以用SlowCheetah做到吗?如果不是这样,将其扩展为允许该功能有多困难?
或者,我可以使用其他一些NuGet软件包或msbuild机制来实现此行为吗?
答案 0 :(得分:1)
用从文件读取或从代码生成的值替换?
不了解SlowCheetah。但是对于MSBuild,您可以定义一个自定义替换任务来完成此任务:
<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="BeforeBuild">
<ReplaceFileText
InputFilename="$(YouConfigFilePath)YourConfigFile.config"
OutputFilename="$(YouConfigFilePath)YourConfigFile.config"
MatchExpression="1f3ac2"
ReplacementText="$(Value)" />
</Target>
注意,由于替换值是从代码生成的,因此您可能需要使用PowerShell脚本或其他脚本来设置msbuild属性的值:
How to set value for msbuild property using powershell?
希望这会有所帮助。