Как заменить строку в файле с помощью msbuild?
Я хочу заменить строку типа "как r u" в файле test.xml со строкой "i am fine" в другом файле xy.xml.using регулярное выражение в ms build.
т.е. я должен прочитать строку из одного файла (xy.xml) и заменить ее в другом файле test.xml.
поэтому, пожалуйста, предоставьте необходимые шаги для решения этой проблемы с примером
Ответы
Ответ 1
EDIT: этот ответ устарел. Используйте решение ниже...
Используйте задачу ReadLinesFromFile, чтобы получить замену строки из файла xy.xml. Проверьте это
Затем используйте значение из xy.xml в качестве строки замены для задачи FileUpdate. Проверьте это
И соединить все это;)
Ответ 2
Это больше не требуется... теперь вы можете ввести С# в файл проекта/сборки...
Определите пользовательскую задачу и параметры следующим образом:
<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", расположенный в выходном каталоге.
Ответ 3
Вы можете использовать задачу FileUpdate из задач сообщества MSBuild, как описано в статье
http://geekswithblogs.net/mnf/archive/2009/07/03/msbuild-task-to-replace-content-in-text-files.aspx
Ответ 4
Я запустил обе замены для того же файла, который находится на диске 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 выше не добавляет bom; однако 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-подзаголовками для сборников unix.