obj = src.sub(/.c$/,'.о')
file(obj) { sh 'cc -с -o #{obj} #{src}' }
end
Однако проще пользоваться правилами. Это еще один механизм Rake, естественно, позаимствованный у make
:
rule '.о' => '.с' do |target|
sh 'сс -с -о #{target.name} #{target.source}'
end
Тут мы наблюдаем небольшое волшебство. Rake устанавливает атрибут source
, подставляя расширение имени файла из хэша (в данном случае .o
заменяется на .c
).
Продолжим сеанс магии. Если затребовать библиотеку rake/clean
, то появляются константы clean
и clobber
(первоначально пустые) и задания :clean
и :clobber
. По сложившейся традиции clean
удаляет временные файлы, a clobber
— еще и собранный исполняемый файл.
Для этих напоминающих массив констант определен метод include
, принимающий маску имени файлов; это неявное использование механизма FileList
.
Теперь наш rake-файл принимает такой вид:
require 'rake/clean'
CLEAN.include('*.о')
CLOBBER.include('myprog')
SRC = FileList['*.с']
OBJ = SRC.ext('o')
rule '.o' => '.c' do |t|
sh 'cc -с -o #{t.name} #{t.source}'
end
file 'hello' => OBJ do
sh 'cc -o hello #{OBJ}'
end
file 'myprog.o' => ['myprog.c']
file 'sub1.o' => ['sub1.c', 'sub1.h']
file 'sub2.o' => ['sub2.c', 'sub2.h']
task :default => ['myprog']
Обратите внимание, что мы не задавали задания «clean» и «clobber» явно. Кроме того, отметим что «clobber» неявно включает операцию «clean». И наконец, мы определили задание default
для удобства запуска rake-файла; теперь можно не указывать явно имя задания, осуществляющего компиляцию и сборку.
У программы rake
есть несколько параметров командной строки. Иногда желательно протестировать rake-файл, не выполняя никаких (потенциально опасных) операций; для этого служит флаг -n
или --dry-run
. Флаг -T
выводит список всех целей в rake- файле. Имеются также флаги, управляющие поиском библиотек, трассировкой, протоколированием и т.д.
Программа Rake сложнее, чем я описал в этом разделе (особенно это касается правил). И она продолжает развиваться. Как обычно, самую свежую информацию ищите в онлайновой документации (http://docs.rubyrake.org/).
21.3. Оболочка irb
Утилита irb
(интерактивный Ruby) уже много лет как включена в дистрибутив Ruby. Можно считать, что это «испытательный стенд» или «площадка для игр», на которой вы опробуете новые приемы и идеи.
Работать с irb
просто. После запуска вы получаете приглашение и можете вводить произвольные выражения Ruby. Выражение вычисляется, и печатается результат. Вот пример короткого сеанса:
$ irb
irb(main):001:0> 'cell' + 'о'
=> 'cello'
irb(main):002:0> 3*79
=> 237
irb(main):003:0> Dir.entries('.').size
=> 17
irb(main):004:0> rand
=> 0.850757389880155
irb(main):005:0> rand
=> 0.679879756672551
irb(main):006:0> defined? Foo
=> nil
irb(main):007:0> defined? Object
=> 'constant'
irb(main):008:0> quit
$
Конечно, это больше, чем калькулятор. При желании можно ввести произвольный код на Ruby:
[hal@localhost ch21]$ irb
irb(main):001:0> require 'mathn'
=> true
irb(main):002:0> gen = Prime.new
=> #
При установке флага -r
выполняется require, поэтому можно включать код из внешнего файла. Предположим, что вы написали такой файл:
# File: foo.rb
class MyClass
attr_accessor :alpha, :beta
def initialize(a, b)
@alpha, @beta = a, b
end
end
obj1 = MyClass.new(23,34)