Msビルドで、test.xmlの「how r u」などの文字列を別のファイルxy.xml.usingの正規表現「i am fine」の文字列に置き換えたい.
つまり、1つのファイル(xy.xml)から文字列を読み取り、それを別のファイルtest.xmlで置き換える必要があります。そのため、この問題を解決するために必要な手順を例とともに提供してください
編集:この回答は廃止されました。以下の解決策を使用してください...
ReadLinesFromFileタスクを使用して、xy.xmlファイルから置換文字列を取得します。 これをチェックしてください
次に、xy.xmlの値をFileUpdateタスクの置換文字列として使用します。 これをチェックしてください
そして、それをすべて一緒に入れます;)
これはもう必要ありません...プロジェクト/ビルドファイルに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>
上記の例では、出力ディレクトリにある「File.exe.config」の「$ version $」を「1.0.0.2」に置き換えます。
記事で説明されているように、MSBuildコミュニティタスクからタスクFileUpdateを使用できます http://geekswithblogs.net/mnf/archive/2009/07/03/msbuild-task-to-replace-content-in-text -files.aspx
@ csharptest.net からの回答は適切ですが、DotNetCoreでは機能しません。私はこれをコメントとして追加したでしょうが、評判は十分ではありません。
DotNetCoreでは、更新する必要があります。
他はすべて同じでなければなりません:
<Project Sdk="Microsoft.NET.Sdk.Web">
...
<UsingTask
TaskName="ReplaceFileText"
TaskFactory="RoslynCodeTaskFactory"
AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.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>
<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="AfterBuildStep" AfterTargets="Build">
<ReplaceFileText
InputFilename="$(OutputPath)File.exe.config"
OutputFilename="$(OutputPath)File.exe.config"
MatchExpression="\$version\$"
ReplacementText="1.0.0.2" />
</Target>
</Project>
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-私はUnixビルドのPerl代替コマンドでexecを実行していました。