2011-12-19 30 views
14

Tôi đang cố gắng thay thế sự xuất hiện của chuỗi trong tệp wxs bằng Nant.Làm thế nào để thay thế chuỗi trong một tệp bằng NANT?

Tôi chỉ tìm thấy ví dụ sau, sử dụng <replaceString>, nhưng có vẻ như nó chỉ có thể được sử dụng trong các tệp được sao chép. Có cách nào khác để thay thế một chuỗi, mà không thực sự sao chép các tập tin trên?

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

Trả lời

2

Tôi tìm thấy một giải pháp cho bạn đây: 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> 

Bạn có thể quấn này trong một phần tử <foreach />.

+1

FWI, liên kết đã thay đổi để http://frank.overseakids.com/?p=182 – thomasb

+0

Cảm ơn bạn @ thomasbtv, tôi vừa cập nhật nó. :) –

8

Dưới đây là các mã:

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

Các tài liệu chính thức cho Nant <loadfile> yếu tố chứa the exact sample you need. Xem phần dưới cùng của trang.

+5

điều này gần như làm việc cho tôi, những gì nó đã mất tích là echo'ing các tập tin trở lại để thay thế cũ - http://stackoverflow.com/questions/487451/how-to-modify-source-with-nant – shanabus

3

Vì vậy, bạn đang cố sửa đổi tệp .wxs là XML, phải không?

Trong trường hợp cụ thể này, bạn có thể sử dụng <xmlpoke> nếu bạn có thể xác định vị trí của các chuỗi để thay thế qua XPath.

1

Tôi chưa bao giờ quản lý để có được filterchain và replacetokens hoạt động bình thường. Tôi đã kết thúc bằng cách sử dụng này và nó hoạt động tuyệt vời.

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

Đây là cách tôi đã làm.

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

đơn giản nhất và đầy đủ nhất, cảm ơn –

1

Tất cả các câu trả lời này không phù hợp với tôi, có thể vì tôi cần thay thế một chuỗi có dấu cách trong đó. Tải một nội dung tập tin với filterchain/replacetokens không làm gì với nội dung của thuộc tính liên quan. Có lẽ tôi đang sử dụng nó sai.
Nhiệm vụ "thay thế" và "replacetext" được đề xuất bởi @Ally và @ John Sterne không tồn tại.

Nó được bao gồm trong quy trình tạo Jenkins, do đó biến MÔI TRƯỜNG phải được đặt thành thư mục hoạt động.

<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

Tôi đã gặp sự cố đó ngay hôm nay. Để giải quyết nó, tôi sử dụng lệnh di chuyển thay vì loadfile hoặc copy. Điều này làm việc cho tôi vì vì tệp của tôi khá nhỏ. Thận trọng khác về điều này là replacetokens cần một mã định danh bắt đầu và mã nhận diện cuối của mã thông báo; begintoken và endtoke tương ứng. Nếu những giá trị này không được đặt, giá trị mặc định sẽ là ký hiệu @. Vì vậy, nếu bạn muốn thay thế một giá trị như MY_SERVER_PLACE_HOLDER có nghĩa là giá trị trong tệp của bạn phải là @ MY_SERVER_PLACE_HOLDER @. Nếu bạn muốn mã thông báo của mình bắt đầu bằng một thứ gì đó khác với bạn nên chỉ định các giá trị bắt đầu và kết thúc. Điều đó sẽ cung cấp cho bạn một ý tưởng về các vấn đề bắt đầu token và endtoken sẽ mang lại cho bạn.

Vì vậy, đây là những gì tôi đã làm trong một nutshell

  1. chuyển các tập tin vào một vị trí tạm thời. Trong bước di chuyển đó, tôi đã sử dụng filterchain với removetokens để thay đổi các giá trị trong tệp.
  2. Ở bước 2, tôi đã chuyển tệp trở lại vị trí ban đầu của nó.
  3. Sau đó, tôi sử dụng lệnh xóa để xóa thư mục tạm thời mà tôi đã tạo.

Đây là những gì tôi đã làm. (Có thể không đúng cú pháp kể từ khi tôi không phải là ở phía trước của mã tại thời điểm hiện tại)

<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" /> 
Các vấn đề liên quan