поместить в одну директорию с src два файла:
• имяПакета. cabal – файл с описанием пакета.
• Setup. hs – файл с инструкциями по установке пакета
.cabal
Посмотрим на простейший файл с описанием библиотеки, этот файл находится в одной директории с
той директорией, в которой содержатся все модули приложения и имеет расширение . cabal:
Name
: Foo
Version
: 1.0
Library
build—depends
: base
exposed—modules
: Foo
Сначала идут свойства пакета. Общий формат определения свойства:
ИмяСвойства : Значение
В примере мы указали имя пакета Foo, и версию 1.0. После того, как мы указали все свойства, мы опре-
деляем будет наш пакет библиотекой или исполняемой программой или возможно он будет и тем и другим.
Если пакет будет библиотекой, то мы помещаем за набором атрибутов слово Library, а если это исполняе-
мая программа, то мы помещаем слово Executable, после мы пишем описание модулей пакета, зависимости
от других пакетов, какие модули будут видны пользователю. Формат составления описаний в этой части та-
кой же как и в самом начале файла. Сначала идёт зарезервированное слово-атрибут, затем через двоеточие
следует значение. Обратите внимание на отступы за словом Library, они обязательны и сделаны с помощью
пробелов, cabal не воспринимает табуляцию.
Файл . cabal может содержать комментарии, они делаются также как и в Haskell, закомментированная
строка начинается с двойного тире.
| 265
Setup.hs
Файл Setup. hs содержит информацию о том как устанавливается библиотека. При установке могут ис-
пользоваться другие программы и библиотеки. Пока мы будем пользоваться простейшим случаем:
import Distribution.Simple
main = defaultMain
Этот файл позволяет нам создавать библиотеки и приложения, которые созданы только с помощью
Haskell. Это не так уж и мало!
Создаём библиотеки
Типичный файл . cabal для библиотеки выглядит так:
Name:
pinocchio
Version:
1.1. 1
Cabal-Version:
>= 1.2
License:
BSD3
License-File:
LICENSE
Author:
Mister Geppetto
Homepage:
http://pinocchio. sourceforge. net/
Category:
AI
Synopsis:
Tools for creation of woodcrafted robots
Build-Type:
Simple
Library
Build-Depends: base
Hs-Source-Dirs: src/
Exposed-modules:
Wood.Robot.Act, Wood.Robot.Percept, Wood.Robot.Think
Other-Modules:
Wood.Robot.Internals
Этим файлом мы описали библиотеку с именем pinocchio, версия 1.1.1, она использует версию cabal
не ниже 1.2. Библиотека выпущена под лицензией BSD3. Файл с лицензией находится в текущей директо-
рии под именем LICENSE. Автор библиотеки Mister Geppetto. Подробнее узнать о библиотеке можно на её
домашней странице http://pinocchio. sourceforge. net/. Атрибут Category указывает на широкую отрасль
знаний, к которой принадлежит наша библиотека. В данном случае мы описываем библиотеку для построе-
ния роботов из дерева, об этом мы пишем в атрибуте Synopsis (краткое описание), поэтому наша библиоте-
ка принадлежит к категории искусственный интеллект или сокращённо AI. Последний атрибут Build-Type
указывает на тип сборки пакета. Мы будем пользоваться значением Simple, который соответствует сборке с
помощью простейшего файла Setup. hs, который мы рассмотрели в предыдущем разделе.
После описания пакета, идёт слово Library, ведь мы создаём библиотеку. Далее в атрибуте Build-
Depends
мы указываем зависимости для нашего пакета. Здесь мы перечисляем все пакеты, которые мы используем в
своей библиотеке. В данном случае мы пользовались лишь стандартной библиотекой base. В атрибуте hs—
source—dirs мы указываем, где искать директорию с исходным кодом библиотеки. Затем мы указываем три
внешних модуля, они будут доступны пользователю после установки библиотеки (атрибут Exposed-Modules),
и внутренние скрытые модули (атрибут Other-Modules).
Создаём исполняемые программы
Типичный файл . cabal для исполняемой программы:
Name:
micro
Version:
0.0
Cabal-Version:
>= 1.2
License:
BSD3
Author:
Tony Reeds
Synopsis:
Small programming language
Build-Type:
Simple
Executable micro
266 | Глава 18: Средства разработки
Build-Depends:
base, parsec
Main-Is:
Main. hs
Hs-Source-Dirs: micro
Executable micro—repl
Main-Is:
Main. hs
Build-Depends:
base, parsec
Hs-Source-Dirs: repl
Other-Modules:
Utils
В этом файле мы описываем две программы. Компилятор языка и интерпретатор языка micro. Если срав-
нить этот файл с файлом для библиотеки, то мы заметим лишь один новый атрибут. Это Main-Is. Он указыва-
ет в каком модуле содержится функция main. После установки этого пакета будут созданы два исполняемых
файла. С именами micro и micro—repl.
Установка пакета
Пакеты устанавливаются с помощью команды install. Необходимо перейти в директорию пакета, ту,
в которой находятся два служебных файла (. cabal и Setup. hs) и директория с исходниками, и запустить
команду:
cabal install
Если мы нигде не ошиблись в описании пакета, не перепутали табуляцию с пробелами при отступах, или
указали без ошибок все зависимости, то пакет успешно установится. Если это библиотека, то мы сможем
подключать экспортируемые ей модули в любом другом модуле, просто указав их в директиве import. При
этом нам уже не важно, где находятся модули библиотеки. Мы имеем возможность импортировать их из
любого модуля. Если же пакет был исполняемой программой, будут созданы бинарные файлы программ. В