web-dev-qa-db-ja.com

msbuildを使用してファイル内の文字列を置き換える方法

Msビルドで、test.xmlの「how r u」などの文字列を別のファイルxy.xml.usingの正規表現「i am fine」の文字列に置き換えたい.

つまり、1つのファイル(xy.xml)から文字列を読み取り、それを別のファイルtest.xmlで置き換える必要があります。そのため、この問題を解決するために必要な手順を例とともに提供してください

31
Nithin

編集:この回答は廃止されました。以下の解決策を使用してください...

ReadLinesFromFileタスクを使用して、xy.xmlファイルから置換文字列を取得します。 これをチェックしてください

次に、xy.xmlの値をFileUpdateタスクの置換文字列として使用します。 これをチェックしてください

そして、それをすべて一緒に入れます;)

4
Ludwo

これはもう必要ありません...プロジェクト/ビルドファイルに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」に置き換えます。

85
csharptest.net

記事で説明されているように、MSBuildコミュニティタスクからタスクFileUpdateを使用できます http://geekswithblogs.net/mnf/archive/2009/07/03/msbuild-task-to-replace-content-in-text -files.aspx

3
Victor Ionescu

@ csharptest.net からの回答は適切ですが、DotNetCoreでは機能しません。私はこれをコメントとして追加したでしょうが、評判は十分ではありません。

DotNetCoreでは、更新する必要があります。

  • 「RoslynCodeTaskFactory」へのタスクファクトリ
  • "$(MSBuildToolsPath)\ Microsoft.Build.Tasks.Core.dll"へのタスクアセンブリ
  • 「System.Core」への参照を削除します
  • 消費ターゲットは、「AfterTargets」属性を「Build」として指定する必要があります

他はすべて同じでなければなりません:

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

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を実行していました。

0
Tom