2013-03-29 2 views
7

Поскольку я столкнулся с этой ошибкой MIXLIB-11, о которой я сообщил команде Mixlib, мне нужно найти walkaround, альтернативу Mixlib :: Shellout.Как читать содержимое файла во время выполнения? Шеф-повар читает во время компиляции

Кратко о проблеме:

Here это заявление, которое говорит «* Не удивительно - чтение происходит во время компиляции, но remote_file ресурс не является на самом деле создано во время выполнения **. «

Благодаря этой функции, Mixlib::Shellout.new("ls", :cwd => '/opt/cubrid/share/webmanager') поднимает» нет такого файла или каталога "ошибка, даже если этот каталог создается во время выполнения с помощью предыдущего рецепта, включенную в этом текущем рецепте.

Есть ли способ прочитать файл/каталог во время выполнения?

ответ

13

Найден ответ: оберните код в ruby_block, и он будет выполнен во время выполнения.

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 

Теперь версия правильно заполнена из файла, созданного в предыдущем рецепте.

-2

Рассмотрите вопрос remote_file. Это выполняется при исполнении (выполнения) времени, и он может также работает с локальными файлами, например:

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

Таким образом, использование remote_file хорошая работа вокруг. При написании пользовательского кода требуется время и может быть подвержено ошибкам. См. Также this answer.

+0

Почему комментарий downvoted? – Cherry

+1

'remote_file' предназначен для передачи (или копирования) файлов, а не для чтения. – sekrett

0

При использовании специальных ресурсов вы можете использовать метод 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

Смежные вопросы