рая выводит на экран 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, он информативно жалуется о забытых зависимостях и неспособности правильно прочитать файл с
описанием пакета.
Удаление библиотеки
Установленные с помощью cabal файлы видны из любого модуля. Имена модулей регистрируются гло-
бально. Если нам захочется установить библиотеку с уже зарегистрированным именем, произойдёт хаос.
Возможно прежняя библиотека нам уже не нужна. Как нам удалить её? Посмотрим на решение для компи-
лятора ghc. Мы можем посмотреть список всех зарегистрированных в ghc библиотек с помощью команды:
$ ghc-pkg list
Cabal-1.8.0.6
array-0.3.0.1
base-4.2.0.2
...
...
Появится длинный список с именами библиотек. Для удаления одной из них мы можем выполнить ко-
манду: