Как заменить строку в файле с помощью 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" />