haskell-notes

конце 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@antondesktop:~/haskellnotes/code/ch17/hello$ cabal install

Resolving dependencies

Configuring hello1.0

Preprocessing library hello1.0

Preprocessing executables for hello1.0

Building hello1.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 hello1.0

[1 of 4] Compiling Utility.World

( src/Utility/World. hs, dist/build/hello/hellotmp/Utility/World. o )

[2 of 4] Compiling Utility.Hello

( src/Utility/Hello. hs, dist/build/hello/hellotmp/Utility/Hello. o )

[3 of 4] Compiling Hello

( src/Hello. hs, dist/build/hello/hellotmp/Hello. o )

[4 of 4] Compiling Main

( src/Main. hs, dist/build/hello/hellotmp/Main. o )

Linking dist/build/hello/hello

Installing library in /home/anton/. cabal/lib/hello1.0/ghc7.4. 1

Installing executable(s) in /home/anton/. cabal/bin

Registering hello1.0

268 | Глава 18: Средства разработки

Мы видим сообщения о процессе установки. После установки в текущей директории пакета появилась

директория dist, в которую были помещены скомпилированные файлы библиотеки. В последних строках

cabal сообщил нам о том, что он установил библиотеку в директорию:

Installing library in /home/anton/. cabal/lib/hello1.0/ghc7.4. 1

и исполняемый файл в директорию:

Installing executable(s) in /home/anton/. cabal/bin

С помощью различных флагов мы можем контролировать процесс установки пакета. Назначать дополни-

тельные директории, указывать куда поместить скомпилированные файлы. Подробно об этом можно почи-

тать в справке, выполнив в командной строке одну из команд:

cabal —help

cabal install —help

Если у вас не получилось сразу установить пакет не отчаивайтесь и почитайте сообщения об ошибках

из cabal, он информативно жалуется о забытых зависимостях и неспособности правильно прочитать файл с

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162