2013-03-29 8 views
7

Ponieważ pojawia się ten błąd MIXLIB-11, który zgłosiłem zespołowi Mixlib, muszę znaleźć rozwiązanie alternatywne dla Mixlib :: Shellout.Jak odczytać zawartość pliku w czasie wykonywania? Szef kuchni czyta w czasie kompilacji

Krótko o problemie:

Here jest stwierdzenie, które mówi „* Nic dziwnego - odczyt dzieje się w czasie kompilacji, ale zasób plik_zdalny jest rzeczywiście stworzony w czasie wykonywania **. „

Dzięki tej funkcji, Mixlib::Shellout.new("ls", :cwd => '/opt/cubrid/share/webmanager') podnosi” Nie ma takiego pliku lub katalogu "błąd mimo, że katalog jest tworzony w czasie wykonywania przez poprzedniego przepisu zawartego w obecnym przepisie.

Czy istnieje sposób na odczyt pliku/katalogu w czasie wykonywania?

Odpowiedz

13

Znaleziono odpowiedź: zawiń kod w ruby_block, a zostanie wykonany w czasie wykonywania.

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 

Teraz wersja jest poprawnie wypełniona z pliku utworzonego w poprzednim przepisie.

-2

Rozważmy remote_file. Jest on wykonywany przy realizacji (do jazdy) czasu, a może również współpracuje z lokalnymi plikami na przykład:

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

Więc za pomocą remote_file jest dobre obejść. Pisanie niestandardowego kodu wymaga czasu i może być podatne na błędy. Zobacz także this answer.

+0

Dlaczego Komentarz downvoted? – Cherry

+1

'remote_file' służy do przesyłania (lub kopiowania) plików, nie do odczytu. – sekrett

0

W przypadku korzystania z zasobów niestandardowych można użyć metody 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