2013-03-29 23 views
7

Bởi vì tôi đang chạy vào lỗi này MIXLIB-11 mà tôi đã báo cáo cho nhóm Mixlib, tôi cần phải tìm một walkaround, một thay thế cho Mixlib :: Shellout.Cách đọc nội dung tệp tại thời gian thực hiện? Đầu bếp đọc tại thời gian biên dịch

ngắn gọn về vấn đề này:

Here là một tuyên bố mà nói: "* Không có gì ngạc nhiên - đọc đang xảy ra tại thời gian biên dịch, nhưng tài nguyên remote_file thực sự là tạo tại thời gian thực hiện **. "

Do tính năng này, Mixlib::Shellout.new("ls", :cwd => '/opt/cubrid/share/webmanager') tăng" Không có tệp hoặc thư mục nào như vậy "lỗi.

Có cách nào để đọc tệp/thư mục tại thời điểm thực thi không?

Trả lời

13

Tìm câu trả lời: quấn mã trong ruby_block và nó sẽ được thực thi tại thời gian chạy.

ruby_block "Check if CURBID Web Manager needs installation" do 
    block do 
    version = "" 

    if File.exists?("#{CWM_HOME_DIR}/appLoader.js") 
     # Read the CWM version from file. 
     f = File.open("#{CWM_HOME_DIR}/appLoader.js") 

     pattern = /Ext\.cwm\.prodVersion = '(\d+\.\d+\.\d+\.\d+)'/ 

     f.each {|line| 
     if match = pattern.match(line) 
      version = match[1] 
      break 
     end 
     } 

     f.close 
    end 
    end 
end 

Bây giờ phiên bản được điền chính xác từ tệp được tạo trong công thức trước đó.

-2

Xem xét remote_file. Nó được thực hiện tại thực hiện (chạy) thời gian, và nó cũng có thể làm việc với các tập tin địa phương ví dụ:

remote_file "Copy file" do 
    path "file:///opt/destination.txt" 
    source "file:///opt/source.txt" 
    owner 'root' 
    group 'root' 
    mode 0755 
end 

Vì vậy, sử dụng remote_file là công việc tốt xung quanh. Trong khi viết mã tùy chỉnh yêu cầu thời gian và có thể dễ bị lỗi. Xem thêm this answer.

+0

Tại sao bình luận được downvoted? – Cherry

+1

'remote_file' là để chuyển (hoặc sao chép) tập tin, không phải để đọc. – sekrett

0

Nếu sử dụng tài nguyên tùy chỉnh, bạn có thể sử dụng phương thức load_current_value.

action :some_action do 

    load_current_value do 
    if File.exist?('/var/www/html/index.html') 
     homepage IO.read('/var/www/html/index.html') 
    end 
    if File.exist?('/var/www/html/404.html') 
     page_not_found IO.read('/var/www/html/404.html') 
    end 
    end 

end 

https://docs.chef.io/dsl_custom_resource.html