替换为从文件读取或从代码生成的值?

Replacing with values read from file or generated from code?

在 SlowCheetah 中,我想转换我的配置文件的某些元素,而不是使用转换文件中的硬编码值,而是使用另一个文件的内容或(最好)从代码生成的值。例如,在从代码生成值的情况下,而不是这样:

{
    "someSettings": {
        "@jdt.replace": {
            "timeTokenAtBuild": "1f3ac2"
        }
    }
}

...我想要这样的东西:

{
    "someSettings": {
        "@jdt.replace": {
            "timeTokenAtBuild": [MyUtilitiesLibrary.GetCurrentTimeToken()]
        }
    }
}

从诸如 PowerShell 脚本之类的东西中获取值也可以。我目前可以使用 SlowCheetah 执行此操作吗?如果不是,扩展它以允许此功能有多难?

或者,我可以使用其他一些 NuGet 包或 msbuild 机制来实现此行为吗?

Replacing with values read from file or generated from code?

不知道 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?

希望这对您有所帮助。