Укрощение stack

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

stask — это утилита для сборки проекта на языке haskell.

Чтобы разобраться с haskell, я решил переписать свой транслитератор клавиатурного ввода erswitcher на этом языке.

Вначале всё шло отлично. Я установил stask и компиллятор ghc:

# pacman -S stack ghc

И указал stack-y использовать системный ghc:

$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 9.0.2

$ stack setup --system-ghc --resolver ltc-9.0.2

Создал проект:

$ stack new erswitcher
$ mv erswitcher erswitcher-2

Получился вот такой проект:

Рис.1. Структура проекта созданного по дефолтному шаблону.
Рис.1. Структура проекта созданного по дефолтному шаблону.

Пробежавшись по файлам я выяснил, что package.yaml используется для указания опций компилятора для сборки исполняемых файлов и юнит-тестов. Так же там прописан автор, лицензия и прочая информация для создания и публикации проекта на hackage.haskell.org. При каждом запуске stack на его основе генерирует файл <проект>.cabal.

Ошибка "Не найден модуль Prelude"

Однако при компилляции выскочила ошибка:

Рис.2. Ошибка во время сборки проекта.
Рис.2. Ошибка во время сборки проекта.

Я ожидал увидеть import Distribution.Simple в app/Main.hs или src/Lib.hs, но поиск по проекту указал на Setup.hs. Я удалил содержимое Setup.hs и... осталась та же ошибка. При этом пакет distributive с библиотекой Distribution.Simple был установлен:

$ ghc-pkg list | grep dist
    distributive-0.6.2.1

$ stack install distribution так же ругнулся, что версии зависимостей у distribution не подходят.

Оказалось, что нужно просто установить ghc-static, так как собирать бинарники с динамической линковкой stack не позволяет, даже если прописать опцию -dynamic в package.yaml:

# pacman -S ghc-static

Модуль Main в app/Main.hs нельзя переименовать

Дальше я перетиеновал модуль app/Main.hs на app/Erswitcher.hs. Соответственно и в файле изменил название модуля:

module Erswitcher where

import Lib

main :: IO ()
main = someFunc

В package.yaml заменил название модуля соответственно:

executables:
  erswitcher-exe:
    main:                Erswitcher.hs
    source-dirs:         app
    ghc-options:
    - -dynamic
    - -threaded
    - -rtsopts
    - -with-rtsopts=-N
    dependencies:
    - erswitcher

Это привело к ошибке:

<no location info>: error:
    output was redirected with -o, but no output will be generated
because there is no Main module.

Оказывается, исходный файл бинарника может называться как угодно, а пакет в нём нужно называть всегда Main:

module Main where

import Lib

main :: IO ()
main = someFunc

Теперь всё скомпиллировалось и можно переходить к планированию архитектуры и тестам.

Библиография

  1. Установка и настройка haskell в Arhlinux / https://wiki.archlinux.org/title/haskell.

  2. R2AUK „Сборка проектов на Haskell при помощи Stack” / https://eax.me/haskell-stack/.

  3. Darviarush „Транслитератор текста и переключатель клавиатуры на haskell” / https://github.com/darviarush/erswitcher-2.

  4. Darviarush „Транслитератор текста и переключатель клавиатуры” / https://github.com/darviarush/erswitcher.

Источник: https://habr.com/ru/post/664434/


Интересные статьи

Интересные статьи

Из статьи вы узнаете про новинки Jetpack Fragment 1.4: поддержку множественного back stack, FragmentStrictMode, новый менеджер состояний Fragment. Также расскажем, какие улучшения произошли под капото...
Всем привет. Когда я искал информацию о журналировании (аудите событий) в Bitrix, на Хабре не было ни чего, в остальном рунете кое что было, но кто же там найдёт? Для пополнения базы знаний...
В обновлении «Сидней» Битрикс выпустил новый продукт в составе Битрикс24: магазины. Теперь в любом портале можно создать не только лендинг или многостраничный сайт, но даже интернет-магазин. С корзино...
Как-то у нас исторически сложилось, что Менеджеры сидят в Битрикс КП, а Разработчики в Jira. Менеджеры привыкли ставить и решать задачи через КП, Разработчики — через Джиру.
Приступая к животрепещущей теме резервного копирования на «Битрикс», прежде всего хотелось бы поблагодарить разработчиков, реализовавших автоматическое резервное копирование в облачное хранилище в вер...