代码之家  ›  专栏  ›  技术社区  ›  Jez

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

  •  0
  • Jez  · 技术社区  · 7 年前

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

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

    …我想要这样的东西:

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

    从powershell脚本中获取值也很好。我现在可以用慢吞吞的吗?如果不是的话,扩展它来允许这个功能有多难?

    或者,是否有其他的nuget包或msbuild机制可以用来实现这种行为?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Leo Liu    7 年前

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

    不知道什么是慢吞吞的。但对于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?

    希望这有帮助。