Как заменить строку в файле с помощью NANT?

Я пытаюсь заменить появление строки в файле 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>

Ответы

Ответ 1

Здесь код:

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

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

Ответ 2

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

<loadfile file="${file}" property="file.content">
    <filterchain>
        <replacestring from="StringToMatch" to="StringToReplace" ignorecase="true" />
    </filterchain>
</loadfile>
<echo file="${file}">${file.content}</echo>

Ответ 3

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

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

Ответ 4

Я нашел решение для вас здесь: 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 @[email protected] 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 />.

Ответ 5

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

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

Ответ 6

Все эти ответы не сработали для меня, может быть, потому, что мне нужно было заменить строку пробелами в ней. Загрузка содержимого файла с помощью 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>

Ответ 7

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

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

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

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

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