конце cabal сообщит нам куда он их положил.
Иногда возникают проблемы с пакетами, которые генерируют исполняемые файлы, а затем с их помощью
устанавливают другие пакеты. Проблема возникает из-за того, что cabal может положить бинарный файл в
директорию, которая не видна следующим программам, которые хотят продолжить установку. В этом слу-
чае необходимо либо переложить созданные бинарные файлы в директорию, которая будет им видна, или
добавить директорию с новыми бинарными файлами в PATH (под UNIX, Linux). Переменная операционной
системы PATH содержит список всех путей, в которых система ищет исполняемые программы, если путь не
указан явно. Посмотреть содержание PATH можно, вызвав:
$ echo $PATH
Появится строка директорий, которые записаны через двоеточие. Для того чтобы добавить директорию
/data/dir в PATH необходимо написать:
$ PATH=$PATH:/data/dir
Эта команда добавит директорию в PATH для текущей сессии в терминале, если мы хотим записать её
насовсем, мы добавим эту команду в специальный скрытый файл . bashrc, он находится в домашней дирек-
тории пользователя. Под Windows добавить директорию в PATH можно с помощью графического интерфейса.
Кликните правой кнопкой мыши на иконку My Computer (Мой Компьютер), в появившемся меню выбери-
те вкладку Properties (Свойства). Появится окно System Properties (Свойства системы), в нём выберите
вкладку Advanced и там нажмите на кнопку Environment variables (Переменные среды). И в этом окне будет
строка Path, её мы и хотим отредактировать, добавив необходимые нам пути.
Давайте потренируемся и создадим библиотеку и исполняемую программу. Создадим библиотеку, кото-
рая выводит на экран Hello World. Создадим директорию hello, и в ней создадим директорию src. Эта ди-
ректория будет содержать исходный код. Главный модуль библиотеки экспортирует функцию приветствия:
module Hello where
import Utility.Hello(hello)
import Utility.World(world)
helloWorld = hello ++ ”, ” ++ world ++ ”!”
Главный модуль программы Main. hs определяет функцию main, которая выводит текст приветствия на
экран:
Пакеты | 267
module Main where
import Hello
main = print helloWorld
У нас будет два внутренних модуля, каждый из которых определяет синоним для одного слова. Мы по-
местим их в папку Utility. Это модуль Utility.Hello
module Utility.Hello where
hello = ”Hello”
И модуль Utility.World:
module Utility.World where
world = ”World”
Исходники готовы, теперь приступим к описанию пакета. Создадим в корневой директории пакета файл
hello. cabal.
Name:
hello
Version:
1.0
Cabal-Version:
>= 1.2
License:
BSD3
Author:
Anton
Synopsis:
Little example of cabal usage
Category:
Example
Build-Type:
Simple
Library
Build-Depends: base == 4.*
Hs-Source-Dirs: src/
Exposed-modules:
Hello
Other-Modules:
Utility.Hello
Utility.World
Executable hello
Build-Depends: base == 4.*
Main-Is: Main. hs
Hs-Source-Dirs: src/
В этом файле мы описали библиотеку и программу. В строке base == 4.* мы указали версию пакета base.
Запись 4.* означает любая версия, которая начинается с четвёрки. Осталось только поместить в корневую
директорию пакета файл Setup. hs.
import Distribution.Simple
main = defaultMain
Теперь мы можем переключиться на корневую директорию пакета и установить пакет:
anton@anton—desktop:~/haskell—notes/code/ch—17/hello$ cabal install
Resolving dependencies…
Configuring hello—1.0…
Preprocessing library hello—1.0…
Preprocessing executables for hello—1.0…
Building hello—1.0…
[1 of 3] Compiling Utility.World
( src/Utility/World. hs, dist/build/Utility/World. o )
[2 of 3] Compiling Utility.Hello
( src/Utility/Hello. hs, dist/build/Utility/Hello. o )
[3 of 3] Compiling Hello
( src/Hello. hs, dist/build/Hello. o )
Registering hello—1.0…
[1 of 4] Compiling Utility.World
( src/Utility/World. hs, dist/build/hello/hello—tmp/Utility/World. o )
[2 of 4] Compiling Utility.Hello
( src/Utility/Hello. hs, dist/build/hello/hello—tmp/Utility/Hello. o )
[3 of 4] Compiling Hello
( src/Hello. hs, dist/build/hello/hello—tmp/Hello. o )
[4 of 4] Compiling Main
( src/Main. hs, dist/build/hello/hello—tmp/Main. o )
Linking dist/build/hello/hello …
Installing library in /home/anton/. cabal/lib/hello—1.0/ghc—7.4. 1
Installing executable(s) in /home/anton/. cabal/bin
Registering hello—1.0…
268 | Глава 18: Средства разработки
Мы видим сообщения о процессе установки. После установки в текущей директории пакета появилась
директория dist, в которую были помещены скомпилированные файлы библиотеки. В последних строках
cabal сообщил нам о том, что он установил библиотеку в директорию:
Installing library in /home/anton/. cabal/lib/hello—1.0/ghc—7.4. 1
и исполняемый файл в директорию:
Installing executable(s) in /home/anton/. cabal/bin
С помощью различных флагов мы можем контролировать процесс установки пакета. Назначать дополни-
тельные директории, указывать куда поместить скомпилированные файлы. Подробно об этом можно почи-
тать в справке, выполнив в командной строке одну из команд:
cabal —help
cabal install —help
Если у вас не получилось сразу установить пакет не отчаивайтесь и почитайте сообщения об ошибках
из cabal, он информативно жалуется о забытых зависимостях и неспособности правильно прочитать файл с