как заменить строку в файле с помощью msbuild? - PullRequest
29 голосов
/ 20 октября 2011

Я хочу заменить строку, например «how ru» в файле test.xml, строкой «у меня все хорошо» в другом файле xy.xml.using регулярного выражения в сборке ms.

т.е. у меня естьпрочитать строку из одного файла (xy.xml) и заменить ее в другом файле test.xml.поэтому, пожалуйста, предоставьте необходимые шаги для решения этой проблемы на примере

Ответы [ 4 ]

85 голосов
/ 22 марта 2014

Это больше не требуется ... теперь вы можете внедрить C # в файл проекта / сборки ...

Определить пользовательскую задачу и параметры следующим образом:

<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>

Тогдапросто назовите его как любую другую задачу MSBuild

<Target Name="AfterBuild">
  <ReplaceFileText 
    InputFilename="$(OutputPath)File.exe.config" 
    OutputFilename="$(OutputPath)File.exe.config" 
    MatchExpression="\$version\$" 
    ReplacementText="1.0.0.2" />
</Target>

В приведенном выше примере «$ version $» заменяется на «1.0.0.2» в «File.exe.config», расположенном в выходном каталоге.

4 голосов
/ 25 октября 2011

РЕДАКТИРОВАТЬ: Этот ответ устарел.Используйте решение ниже ...

Используйте задачу ReadLinesFromFile, чтобы получить строку замены из файла xy.xml. Проверьте это

Затем используйте значение из xy.xml в качестве строки замены для задачи FileUpdate. Проверьте это

И соедините все вместе;)

3 голосов
/ 02 октября 2014

Вы можете использовать задачу FileUpdate из Задач сообщества MSBuild, как описано в статье. http://geekswithblogs.net/mnf/archive/2009/07/03/msbuild-task-to-replace-content-in-text-files.aspx

0 голосов
/ 20 марта 2015

Я запустил обе замены для одного и того же файла, который находится на диске Unix, и использовал путь unc к нему \ server \ path ...:

<ReplaceFileText
  InputFilename="$(fileToUpdate)"
  OutputFilename="$(fileToUpdate)"
  MatchExpression="15.0.0"
  ReplacementText="15.3.1"/>


<FileUpdate Files="$(fileToUpdate2)"
            Regex="15.0.0"
            ReplacementText="15.3.1" />

и пользовательское действие cs выше не добавляет бомбу; однако FileUpdate сделал:

%head -2 branding.h branding2.h
==> branding.h <==
#/* branding.h
#** This file captures common branding strings in a format usable by both sed and C-preprocessor.

==> branding2.h <==
#/* branding.h
#** This file captures common branding strings in a format usable by both sed and C-preprocessor.

Спасибо csharptest.net - я делал exec с командами perl subtitute для сборок unix.

...