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

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

Жанры

Программирование на языке 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" + "о"

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

Наследие Маозари 2

Панежин Евгений
2. Наследие Маозари
Фантастика:
попаданцы
рпг
аниме
5.00
рейтинг книги
Наследие Маозари 2

Проводник

Кораблев Родион
2. Другая сторона
Фантастика:
боевая фантастика
рпг
7.41
рейтинг книги
Проводник

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

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

Архонт

Прокофьев Роман Юрьевич
5. Стеллар
Фантастика:
боевая фантастика
рпг
7.80
рейтинг книги
Архонт

Петля, Кадетский корпус. Книга третья

Алексеев Евгений Артемович
3. Петля
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Петля, Кадетский корпус. Книга третья

Локки 10. Потомок бога

Решетов Евгений Валерьевич
10. Локки
Фантастика:
фэнтези
юмористическое фэнтези
героическая фантастика
боевая фантастика
5.00
рейтинг книги
Локки 10. Потомок бога

Ваше Сиятельство 3

Моури Эрли
3. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Ваше Сиятельство 3

Тайны затерянных звезд. Том 3

Лекс Эл
3. Тайны затерянных звезд
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Тайны затерянных звезд. Том 3

Наномашины, ученик! Том 6

Новиков Николай Васильевич
6. Первый среди карапузов
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Наномашины, ученик! Том 6

Я граф. Книга XII

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

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

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

Звездная Кровь. Экзарх I

Рокотов Алексей
1. Экзарх
Фантастика:
боевая фантастика
рпг
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Звездная Кровь. Экзарх I

География растений

Гумбольдт Александр
Классики естествознания
Научно-образовательная:
ботаника
7.50
рейтинг книги
География растений

Ермак. Противостояние. Книга одиннадцатая

Валериев Игорь
11. Ермак
Фантастика:
попаданцы
альтернативная история
4.50
рейтинг книги
Ермак. Противостояние. Книга одиннадцатая