Как заменить строку в файле, используя NANT? - PullRequest
14 голосов
/ 19 декабря 2011

Я пытаюсь заменить вхождение строки в файле wxs с помощью Nant.

Я нашел только следующий пример, в котором используется <replaceString>, но кажется, что его можно использовать только внутри скопированных файлов. Есть ли другой способ заменить строку, не копируя файлы?

<property name="NOW" value="${datetime::now()}" />
<copy todir="out">
    <fileset basedir="in">
        <include name="**/*" />
    </fileset>
    <filterchain>
        <replacetokens>
            <token key="NOW" value="${TODAY}" />
        </replacetokens>
        <tabstospaces />
    </filterchain>
</copy>

Ответы [ 7 ]

9 голосов
/ 22 декабря 2011

Вот код:

<loadfile file="token.txt" property="token-file">
    <filterchain>
        <replacetokens>
            <token key="NOW" value="${datetime::now()}" />
        </replacetokens>
    </filterchain>
</loadfile>

Официальные документы NAnt для элемента <loadfile> содержат точный образец, который вам нужен .Смотрите внизу страницы.

7 голосов
/ 13 сентября 2013

Вот как я это сделал.

<loadfile file="${file}" property="file.content">
    <filterchain>
        <replacestring from="StringToMatch" to="StringToReplace" ignorecase="true" />
    </filterchain>
</loadfile>
<echo file="${file}">${file.content}</echo>
3 голосов
/ 22 декабря 2011

Итак, вы пытаетесь изменить файл .wxs, который является XML, верно?

В этом конкретном случае вы можете использовать <xmlpoke>, если вы можете определить положениестроки для замены через XPath.

2 голосов
/ 21 декабря 2011

Я нашел решение для вас здесь: http://frank.overseakids.com/?p=182

<loadfile file=”${dir.template}\template.db_name.sql” property=”restore.db.sql.db_name”>
<filterchain>
<replacetokens>
<!– this looks for tokens like @blah.blah@ in the file being loaded and replaces them–>
<token key=”restore.db.prefix” value=”${restore.db.prefix}” />
<token key=”backup.file.path” value=”${backup.file.path}” />
</replacetokens>
</filterchain>
</loadfile>
<property name=”current.db” value=”db_name” />
<property name=”current.log” value=”${dir.log}\${restore.db.logfile.prefix}_db_name.log” />
<property name=”current.file” value=”${dir.template}\restore.db_name.tmp.sql” />
<delete if=”${file::exists(current.file)}” file=”${current.file}” />
<echo file=”${current.file}”>${restore.db.sql.db_name}</echo>

Вы можете заключить это в элемент <foreach />.

1 голос
/ 10 января 2014

У меня была эта проблема сегодня. Чтобы решить эту проблему, я использовал команду перемещения вместо loadfile или copy. Это сработало для меня, потому что мой файл был довольно маленьким Другое предостережение по этому поводу состоит в том, что для замены токенов нужен начальный идентификатор и конечный идентификатор токена; begintoken и endtoke соответственно. Если они не установлены, значениями по умолчанию являются символ @. Поэтому, если вы хотите заменить значение, такое как MY_SERVER_PLACE_HOLDER, это означает, что значение в вашем файле должно быть @ MY_SERVER_PLACE_HOLDER @. Если вы хотите, чтобы ваш токен начинался с чего-то иного, чем вы должны указать значения begintoken и endtoken. Это должно дать вам представление о проблемах, которые принесут вам токен begin и endtoken.

Итак, вот что я сделал в двух словах

  1. Переместил файл во временную папку. В этом ходу я использовал filterchain с removetokens для изменения значений в файле.
  2. На шаге 2 я переместил файл обратно в его исходное местоположение.
  3. Затем я использовал команду delete для удаления созданной временной папки.

Вот что я сделал. (Не может быть синтаксически правильным, так как сейчас я не нахожусь перед кодом)

    <move todir="temp">
       <fileset basedir="in">
         <include name="myfile.dat" />
       </fileset>
       <filterchain>
          <replacetokens>
             <token key="MY_SERVER_PLACE_HOLDER" value="http://www.someserver.com" />
          </replacetokens>
          <tabstospaces />
      </filterchain>
    </move>
    <move todir="in">
       <fileset basedir="temp">
           <include name="myfile.dat" />
       </fileset>
    </move>
    <delete dir="temp" />
1 голос
/ 12 декабря 2013

Все эти ответы у меня не сработали, может быть потому, что мне нужно было заменить строку пробелами в ней. Загрузка содержимого файла с помощью filterchain / replacetokens ничего не сделала с содержимым связанного свойства. Может быть, я использую это неправильно.
Задачи «replacestring» и «replacetext», предложенные @Ally и @John Sterne, не существуют.

Он включен в процесс сборки Jenkins, поэтому для переменной ENVIRONMENT должен быть установлен рабочий каталог.

    <loadfile file="./my/batch.bat" property="file.content" />
    <property name="file.content"
              value="${string::replace(file.content, 'D:\path to\the working\space', environment::get-variable('WORKSPACE'))}" />
    <property name="file.content"
              value="${string::replace(file.content, 'Cd C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin', 'CD /D C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin')}" />
    <echo file="./my/batch.bat">${file.content}</echo>
1 голос
/ 05 декабря 2012

Мне так и не удалось заставить работать цепочку фильтров и замены токенов. Я использовал это, и он прекрасно работает.

<replacetext filename="${filename}" src="stringToBeReplaced" replacement="replacementString" />
...