2011-12-19 172 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" /> 
相關問題