首页 > 解决方案 > 替换为从文件读取或从代码生成的值?

问题描述

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

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

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

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

从 PowerShell 脚本之类的东西中获取价值也可以。我现在可以用 SlowCheetah 做到这一点吗?如果不是,扩展它以允许此功能有多难?

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

标签: visual-studiomsbuildpublishingslowcheetah

解决方案


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

不知道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 属性的值:

如何使用 powershell 设置 msbuild 属性的值?

希望这可以帮助。


推荐阅读