Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Ruby: Общие вопросы > Вывод сообщений в консоль используя Rake


Автор: UniBomb 3.3.2011, 14:28
Добрый день. Использую Rake для компиляции в gcc, ибо местный make со своими makefil'ами очень не нравится. Пример задачи в рейкфайле:

Код

task :create_obj do
    puts "Create object file #{source}.o"
    sh "avr-gcc -g -Os -Wall -mmcu=#{mmcu} -std=#{std} #{source}.c -o build/#{source}.o"
end

task :build => :create_obj do
    puts "Get load file for FLASH #{source}.hex from #{source}.o"
    sh "avr-objcopy -R .eeprom -O ihex build/#{source}.o build/#{source}.hex"
end


Т.е. ещё хочется выводить сообщения о том, что же в данный момент времени происходит. Но вот беда - все сообщения, которые я вывожу через puts выводятся в самом конце, когда всё сделано. Иными словами сначала я получу сообщения компилятора, который вызываю в задачах, и только потом свои надписи. Можно как-то это исправить? Что я пробовал:

Код

sh 'My text'
sh 'echo my text'

В первом случае рейк ругается, во втором выводится как сама команда echo, так и выводимый ей текст, т.е.:

Код

echo my text
my text


ps: маленький бонус вопрос - а можно ли вызывать задачу из другой? Я не имею в виду зависимости. Сейчас я делаю так: sh "rake build", т.е. рекурсивно запускаю рейк с нужным таргетом. Но может можно как-то проще?  smile 

Автор: source777 3.3.2011, 19:42
Цитата(UniBomb @  3.3.2011,  14:28 Найти цитируемый пост)
Но вот беда - все сообщения, которые я вывожу через puts выводятся в самом конце, когда всё сделано.

Странно, не замечал такого поведения, возможно настройки буферизации вывода такие... 
Попробуй вызвать STDOUT.flush после puts

Цитата(UniBomb @  3.3.2011,  14:28 Найти цитируемый пост)
маленький бонус вопрос - а можно ли вызывать задачу из другой? 

Да: 
Код

Rake::Task['full:task:name'].invoke


Автор: UniBomb 4.3.2011, 09:07
source777, спасибо, flush помог, но тем не менее всё равно не понятно почему так происходит. За бонус-ответ тоже спасибо, только там кавычки как оказалось не нужны  smile 

Автор: source777 4.3.2011, 22:07
Цитата(UniBomb @  4.3.2011,  09:07 Найти цитируемый пост)
flush помог, но тем не менее всё равно не понятно почему так происходит

Раз помог, то как раз всё понятно. Вывод на консоль буферизируется, поэтому по факту будет показан, когда процессор будет не сильно нагружен, а у тебя сразу после вывода ресурсоёмкая задача в виде компиляции стоит, поэтому процессор вспоминает о буфере вывода только после завершения компиляции. А для форсирования вывода на консоль как раз предназначен flush.

Автор: UniBomb 5.3.2011, 09:21
source777, ясно  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)