2011-07-26 39 views
6

Tôi cần sử dụng NAnt để cập nhật một dòng cụ thể trong tệp .js. Dòng sẽ được giống như:Làm thế nào để thay đổi một dòng trong một tệp bằng cách sử dụng NAnt?

global.ServerPath = 'http://server-path/'; 

Tôi cần một cách để cập nhật "server-path" một phần của dòng với các máy chủ đích.
ReplaceString không tốt, vì tôi sẽ không biết đường dẫn trong tệp là gì khi tôi cập nhật nó.

Bất kỳ trợ giúp nào?

Cảm ơn trước

+0

Các bạn đã xem xét liệu "cứng" mã hóa các con đường máy chủ vào một tập tin js là giải pháp tốt nhất (cho bất kỳ vấn đề gì nó giải quyết)? Lấy giá trị từ toàn bộ URL trong javascript phía máy khách hoặc phát ra một mẩu nhỏ nội tuyến js từ trang phía máy chủ (dựa trên tiêu đề máy chủ thực) có thể là một số lựa chọn thay thế. –

+0

Có, thật không may là cần thiết. Chúng tôi đang lưu trữ ứng dụng của chúng tôi dưới dạng plugin trong ứng dụng của bên thứ ba và dòng này trong JS là cần thiết để hệ thống của bên thứ ba tìm thấy chúng tôi. – Nellius

+0

Nếu 'string :: replace' không hoạt động' 'có thể thực hiện công việc. Tôi cần phải làm việc này. Hãy theo dõi ... –

Trả lời

12

Nếu string::replace không hoạt động <regex> có thể thực hiện công việc. Đây là nó:

<?xml version="1.0" encoding="utf-8" ?> 
<project name="replace.line" default="replace"> 
    <target name="replace" descripton="replaces a line"> 
    <property 
     name="js.file" 
     value="C:\foo.js" /> 
    <loadfile file="${js.file}" property="js.file.content" /> 
    <regex 
     input="${js.file.content}" 
     pattern="(?'BEFORE'.*)global\.ServerPath\s*=\s*'[^']*';(?'AFTER'.*)" /> 
    <echo 
     file="${js.file}" 
     message="${BEFORE}global.ServerPath = 'http://bla/';${AFTER}" 
     append="false" /> 
    </target> 
</project> 
+2

Tôi đã gặp vấn đề tương tự như Aedna. Sử dụng '(? 'BEFORE' [\ w \ s \ W] *)' thay vì '(? 'BEFORE'. *)' (Và tương tự cho nhóm đối sánh SAU) làm việc cho tôi. Tôi tự hỏi nếu đó là một điều mã hóa. – Gerbus

+0

Áp dụng mã được cập nhật từ @Gerbus – Zymotik

1

cũng có thể sử dụng cùng với copy task filterchain và replacetokens filter.

Dưới đây là một ví dụ:

  <token key="WebConfig.EnvironmentName" value="${env_webconfig_EnvironmentName}" /> 
      <token key="WebConfig.SMTPServerName" value="${env_webconfig_SMTPServerName}" /> 
      <token key="WebConfig.DatabaseConnectionString" value="${env_drmportal_webconfig_DatabaseConnectionString}" /> 

     </replacetokens> 
    </filterchain> 
</copy> 

Tôi giữ lại tất cả các file mẫu của tôi trong một/config/thư mục (ví dụ web.config.template) và sử dụng của tôi tác vụ sao chép sẽ thay thế các giá trị khi sao chép vào cùng một thư mục/config/nhưng không có phần mở rộng tệp ".template". Sau đó tôi làm những gì cần thiết sau đó ... \

Tôi sẽ thừa nhận rằng nó một chút cồng kềnh sử dụng tài sản theo cách bạn phải làm, nhưng bạn có tính linh hoạt để có thể tải các bộ thuộc tính khác nhau giá trị theo môi trường (ví dụ: địa phương, dàn dựng, sản xuất, v.v.) nhưng đó là một chút nhiều hơn tôi nghĩ rằng bạn đang yêu cầu.

4

không nên là [\ w \ s \ W] * thay vì. * Sau SAU và TRƯỚC KHI có thể chụp tất cả các dòng?

trong trường hợp của tôi. * Được chụp chỉ đường, trong khi [\ w \ s \ W] * làm việc cho toàn bộ tập tin

Các vấn đề liên quan