【问题标题】:Replacing with values read from file or generated from code?替换为从文件读取或从代码生成的值?
【发布时间】:2018-12-14 04:20:03
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: visual-studio msbuild publishing slowcheetah


    【解决方案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?

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2017-03-20
      • 2012-04-20
      • 1970-01-01
      • 2018-05-15
      • 2017-12-12
      • 1970-01-01
      • 1970-01-01
      • 2015-02-09
      • 2016-05-10
      相关资源
      最近更新 更多