2013-12-13 3 views
2

Я новичок в поваре и поваренной книге. Я создаю поваренную книгу, и я хочу добавить в конце файла некоторое содержимое (текст). На данный момент я использую:Как добавить содержимое в файл для поваренной книги повара?

file "#{node['dir']}/#{params[:name]}.txt" do 
    content "my full text" 
end 

, но я должен всегда добавлять в «содержание» старого содержания, потому что это приведет к перезаписи. Есть ли другой способ добавить содержимое?

Спасибо pasquy

+0

Обратите внимание, что просто добавление текста в файл не считается хорошей практикой, поскольку оно не является [idempotent] (http://en.wikipedia.org/wiki/Idempotence) (т. Е. Вы не можете запускать свой рецепт снова и получить тот же конечный результат, что и раньше, что большинство людей считают весьма важным для рецептов). Когда это возможно, вы должны попытаться управлять целыми файлами с помощью шеф-повара, поскольку это намного проще контролировать, чем проверять существующие файлы и выборочно добавлять контент. –

+0

Хорошо, спасибо Хольгер. FYI Я работаю над авторизацией subversion, и мне нужно добавить в файл apache dav_svn.load текст «LoadModule ... mod_authz_svn.so». – pasquy73

+0

Apache имеет концепцию конфигурационных каталогов, где он загружает все файлы, которые находятся там (например, '/ etc/httpd/config.d'). Просто создайте новый файл с вашим контентом в этом каталоге (или похожим в зависимости от вашей ОС, на debian/ubuntu его '/ etc/apache2/mods-available' с символической ссылкой в'/etc/apache2/mods-enabled'). –

ответ

1

Вы можете использовать прямой код рубин, если вы хотите, как

open('myfile.out', 'a') do |f| 
f << "and again ...\n" 
end 

Это может быть сделано в поставщике ruby_block, если вы хотите. This link describes how to use that type of block

Другой альтернативой является чтение в вашем содержимом файлов, а затем конкатенация с обновленной строкой в ​​текущем блоке?

+0

Спасибо ... это работает. Как я могу параметризовать файл пути myfile.out? – pasquy73

+0

точно так же, как вы делали до открытых (@ # {узел [ 'реж']}/# {Params [: имя]}. .txt», 'а') у | е | Если сделать это – PatrickWalker

2

Пожалуйста, не используйте прямой Ruby для этого. Там есть встроенный класс в шеф-поваре под названием FileEdit, который будет обрабатывать это для вас. В частности, вы, вероятно, хотите insert_line_if_no_match.

+1

Использование встроенный класс имеет смысл. Не знал об этом во время моего ответа – PatrickWalker

1

Если вы используете только рубиновый код, тогда шеф-повар будет писать содержимое во время загрузки вашего рецепта ПЕРЕД проверкой любых зависимостей. И определенно не во время конвергенции.

Комбинация рубина и шеф-повара сделает трюк.

file = File.open(#{node['dir']}/#{params[:name]}.txt, "rb") 
existingContents = file.read 
newContents = existingContents + "my full text" 

file "#{node['dir']}/#{params[:name]}.txt" do 
    content newContents 
end 

Так идея построить строку во время загрузки, передать эту строку повар и пусть повар изменить содержимое на правой сцене во время конвергенции.

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