2011-12-19 68 views
14

我试图用南特来替换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> 

回答

2

我找到了一个解决方案,你在这里: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 />元素包装这个。

+1

FWI,链接已更改为http://frank.overseakids.com/?p=182 – thomasb 2013-12-12 10:17:53

+0

谢谢@ thomasbtv,我只是更新了它。 :) – 2013-12-13 03:35:01

8

下面的代码:

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

<loadfile>元的官方文档楠包含the exact sample you need。查看页面底部。

+5

这几乎为我工作,它缺少的是echo'ing文件退出来取代旧的 - http://stackoverflow.com/questions/487451/how-to-modify-source-with-nant – shanabus 2013-04-12 18:33:48

3

所以您要修改.wxs文件,该文件是XML,对吧?

在,如果你能够确定字串的位置通过XPath来代替你可以使用<xmlpoke>这种特殊情况下。

1

我从来没有设法得到filterchain和replacetokens正常工作。我最终使用这个,它很好。

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

下面是我做到的。

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

最简单,最完整,谢谢 – 2015-11-30 11:14:49

1

所有这些答案都不适用于我,也许是因为我需要用空格替换字符串。使用filterchain/replacetokens加载文件内容对相关属性的内容没有任何影响。也许我错了。
@Ally和@John Sterne建议的任务“替换字符串”和“替换文字”不存在。

它包含在詹金斯生成过程,从而环境变量必须设置到工作目录。

<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

我今天有这个问题。为了解决这个问题,我使用了move命令而不是loadfile或copy。这对我有用,因为我的文件非常小。另一个需要注意的是replacetokens需要令牌的开始标识符和结束标识符;分别开口和结束。如果没有设置,默认值是@符号。因此,如果您要替换MY_SERVER_PLACE_HOLDER这样的值,这意味着文件中的值必须是@ MY_SERVER_PLACE_HOLDER @。如果您希望令牌以与您不同的东西开始,则应指定begintoken和endtoken值。这应该让你了解开始令牌和归因会带给你的问题。

所以这是我简而言之

  1. 没有移动的文件到一个临时位置。在那个举动中,我用 filter和removetokens来改变文件中的值。
  2. 在步骤2中,我将文件移回原始位置。
  3. 然后我使用删除命令来删除我创建的临时文件夹。

这是我做的。 (可能不是语法正确的,因为我在前面的代码,此刻我不是)

<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" /> 
相关问题