рая выводит на экран 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.Hellomodule Utility.Hello where
hello =
”Hello”И модуль Utility.World
:module Utility.World where
world =
”World”Исходники готовы, теперь приступим к описанию пакета. Создадим в корневой директории пакета файл
hello.
cabal.Name:
hello
Version:
1.0
Cabal-Version:
>=
1.2License:
BSD3
Author:
Anton
Synopsis:
Little
example of cabal usageCategory:
Example
Build-Type:
Simple
Library
Build-Depends:
base == 4.*Hs-Source-Dirs:
src/Exposed-
modules:Hello
Other-Modules:
Utility.Hello
Utility.World
Executable
helloBuild-Depends:
base == 4.*Main-Is: Main.
hsHs-Source-Dirs:
src/В этом файле мы описали библиотеку и программу. В строке base ==
4.* мы указали версию пакета base.Запись 4.*
означает любая версия, которая начинается с четвёрки. Осталось только поместить в корневуюдиректорию пакета файл Setup.
hs.import Distribution.Simple
main =
defaultMainТеперь мы можем переключиться на корневую директорию пакета и установить пакет:
anton@
anton-desktop:~/haskell-notes/code/ch-17/hello$ cabal installResolving
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. 1Installing
executable(s) in /home/anton/. cabal/binRegistering
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
...
...
Появится длинный список с именами библиотек. Для удаления одной из них мы можем выполнить ко-
манду: