web-dev-qa-db-fra.com

comment remplacer la chaîne dans le fichier en utilisant msbuild?

Je souhaite remplacer une chaîne telle que "how r u" dans le fichier test.xml par une chaîne "je vais bien" dans un autre fichier xy.xml.using expression régulière dans ms build.

c'est-à-dire que je dois lire la chaîne d'un fichier (xy.xml) et la remplacer dans un autre fichier test.xml. alors s'il vous plaît fournir les étapes nécessaires pour résoudre ce problème avec l'exemple

28
Nithin

EDIT: Cette réponse est obsolète. Utilisez la solution ci-dessous ...

Utilisez la tâche ReadLinesFromFile pour obtenir la chaîne de remplacement à partir du fichier xy.xml. Vérifie ça

Ensuite, utilisez la valeur de xy.xml en tant que chaîne de remplacement pour la tâche FileUpdate. Vérifie ça

Et mettez le tout ensemble;)

4
Ludwo

Ce n'est plus nécessaire ... vous pouvez maintenant injecter C # dans le fichier projet/construction ...

Définissez une tâche personnalisée et des paramètres comme suit:

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

Ensuite, appelez-le simplement comme n'importe quelle autre tâche MSBuild

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

L'exemple ci-dessus remplace "$ version $" par "1.0.0.2" dans le fichier "File.exe.config" situé dans le répertoire de sortie.

82
csharptest.net

Vous pouvez utiliser la tâche FileUpdate à partir des tâches de la communauté MSBuild, comme expliqué dans l'article http://geekswithblogs.net/mnf/archive/2009/07/03/msbuild-task-to-replace-content- in-text-files.aspx

3
Victor Ionescu

J'ai exécuté les deux remplacements sur le même fichier qui se trouve sur un lecteur Unix et ai utilisé le chemin unc qui lui est destiné\serveur\chemin ...:

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


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

et l'action personnalisée cs ci-dessus n'ajoute pas le nom d'origine; Cependant, FileUpdate a:

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

Merci csharptest.net - Je faisais des commandes avec des commandes de sous-titrage Perl pour les builds Unix.

0
Tom