Замена на значения, прочитанные из файла или сгенерированные из кода? - PullRequest
0 голосов
/ 05 июля 2018

В SlowCheetah я хотел бы преобразовать некоторые элементы моего конфигурационного файла не с жестко запрограммированными значениями в файле преобразования, а либо с содержимым другого файла или (предпочтительно) значением, сгенерированным из кода. Например, в случае генерации значения из кода, вместо этого:

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

... Я хочу что-то вроде этого:

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

Было бы неплохо получить значение из чего-то вроде скрипта PowerShell. Могу ли я сделать это с SlowCheetah в настоящее время? Если нет, то насколько сложно было бы расширить его, чтобы разрешить эту функциональность?

В качестве альтернативы, есть ли какой-нибудь другой пакет NuGet или механизм msbuild, который я могу использовать для достижения этой цели?

1 Ответ

0 голосов
/ 06 июля 2018

Замена значениями, считанными из файла или сгенерированными из кода?

Не знаю, как насчет медленного гепарда. Но для 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:

Как установить значение для свойства msbuild с помощью powershell?

Надеюсь, это поможет.

...