Чтение онлайн

на главную - закладки

Жанры

Программирование на языке Ruby
Шрифт:

task(:mytask) { do_something }

Рассмотрим более конкретный пример. Предположим, что имеется программа

myprog.с
, написанная на С, и еще два связанных с ней исходных файла (каждый со своим заголовочным файлом). Иными словами, у нас есть пять исходных файлов:

myprog.с

sub1.с

sub1.h

sub2.с

sub2.h

Мы хотим собрать из них исполняемый файл

myprog
. Эта процедура состоит из нескольких шагов: откомпилировать
все файлы с расширением
, а затем скомпоновать получившиеся в результате файлы с расширением
.

Начнем с метода

file
, который определяет зависимости файлов:

file "myprog.о" => ["myprog.с"]

file "sub1.о" => ["sub1.с", "sub1.h"]

file "sub2.o" => ["sub2.c", "sub2.h"]

file "myprog" => ["sub1.o", "sub2.o"]

Отметим, что метод

file
принимает хэш, который ассоциирует имя файла с массивом имен файлов, от которых он зависит.

Теперь перейдем к построению двоичных файлов. Расширим написанный выше код. Если после вызова метода

file
указать блок, то мы сможем ассоциировать с файлом набор действий, которые необходимо выполнить для создания этого файла:

file "myprog.о" => ["myprog.с"] do

 sh "сс -с -о myprog.о myprog.с"

end

file "sub1.o" => ["sub1.с", "sub1.h"] do

 sh "сс -с -o sub1.o sub1.c"

end

file "sub2.o" => ["sub2.c", "sub2.h"] do

 sh "сс -с -o sub2.o sub2.c"

end

file "myprog" => ["sub1.o", "sub2.o"] do

 sh "cc -o myprog myprog.о sub1.o sub2.o"

end

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

FileList
; он понимает метасимволы (шаблоны) и позволяет работать сразу с несколькими файлами. В данном случае поместим все файлы с расширением
.c
в список
SRC
. Константа типа
FileList
ведет себя как массив:

SRC = FileList["*.с"]

Теперь можно определить действия в цикле, как показано ниже. И обратите внимание, что зависимости здесь не упоминаются — Rake самостоятельно учтет эту информацию, если она была задана в другом месте.

SRC.each do |src|

 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 сложнее, чем я описал в этом разделе (особенно это касается правил). И она продолжает развиваться. Как обычно, самую свежую информацию ищите в онлайновой документации .

21.3. Оболочка irb

Утилита

irb
(интерактивный Ruby) уже много лет как включена в дистрибутив Ruby. Можно считать, что это «испытательный стенд» или «площадка для игр», на которой вы опробуете новые приемы и идеи.

Работать с

irb
просто. После запуска вы получаете приглашение и можете вводить произвольные выражения Ruby. Выражение вычисляется, и печатается результат. Вот пример короткого сеанса:

$ irb

irb(main):001:0> "cell" + "о"

Поделиться:
Популярные книги

Кодекс Охотника. Книга VI

Винокуров Юрий
6. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга VI

Страх

Рыбаков Анатолий Наумович
2. Дети Арбата
Проза:
историческая проза
9.49
рейтинг книги
Страх

Отмороженный

Гарцевич Евгений Александрович
1. Отмороженный
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Отмороженный

Я Гордый часть 2

Машуков Тимур
2. Стальные яйца
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я Гордый часть 2

Законы Рода. Том 11

Мельник Андрей
11. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Законы Рода. Том 11

Любовь Носорога

Зайцева Мария
Любовные романы:
современные любовные романы
9.11
рейтинг книги
Любовь Носорога

Я еще не царь

Дрейк Сириус
25. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я еще не царь

Сильнейший Столп Империи. Книга 4

Ермоленков Алексей
4. Сильнейший Столп Империи
Фантастика:
фэнтези
аниме
фантастика: прочее
попаданцы
5.00
рейтинг книги
Сильнейший Столп Империи. Книга 4

На границе империй. Том 2

INDIGO
2. Фортуна дама переменчивая
Фантастика:
космическая фантастика
7.35
рейтинг книги
На границе империй. Том 2

Я все еще князь. Книга XXI

Дрейк Сириус
21. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я все еще князь. Книга XXI

Граф

Ланцов Михаил Алексеевич
6. Помещик
Фантастика:
альтернативная история
5.00
рейтинг книги
Граф

Первый среди равных. Книга VI

Бор Жорж
6. Первый среди Равных
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Первый среди равных. Книга VI

Развод. Без права на ошибку

Ярина Диана
Любовные романы:
современные любовные романы
короткие любовные романы
5.00
рейтинг книги
Развод. Без права на ошибку

Отряд

Валериев Игорь
5. Ермак
Фантастика:
альтернативная история
5.25
рейтинг книги
Отряд