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

时间:2018-07-05 15:47:22

标签: visual-studio msbuild publishing slowcheetah

在SlowCheetah中,我希望不使用转换文件中的硬编码值来转换配置文件的某些元素,而是使用另一个文件的内容或(最好是)从代码生成的值来转换。例如,在通过代码生成值的情况下,请执行以下操作:

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

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

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

从类似PowerShell脚本的值中获取值也可以。我现在可以用SlowCheetah做到吗?如果不是这样,将其扩展为允许该功能有多困难?

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

1 个答案:

答案 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?

希望这会有所帮助。