У подальшому я згадаю два інструменти, які порівнюються як встановлення та stabal . Зокрема, я буду використовувати cabal-install, щоб уникнути плутанини з бібліотекою Cabal , яка є загальною інфраструктурою, яка використовується обома інструментами.
Грубо кажучи, ми можемо сказати , міжсобойчик встановити і стека є інтерфейсами для змовників . Обидва інструменти дозволяють будувати проекти Haskell, набори залежностей яких можуть конфліктувати між собою в межах єдиної системи. Ключова різниця між ними полягає в тому, як вони вирішують цю мету:
За замовчуванням cabal-install , коли його запитуватимуть створити проект, перегляне залежності, визначені у його .cabal
файлі, та використає вирішувач залежності, щоб визначити набір пакунків та версій пакетів, які його задовольняють. Цей набір взято з Hackage в цілому - всі пакунки та всі версії, минулі та сучасні. Як тільки буде здійснено реальний план збірки, обрана версія залежностей буде встановлена та індексована в базі даних десь у ~/.cabal
. Конфліктів версій між залежностями можна уникнути шляхом індексації встановлених пакетів відповідно до їх версій (а також інших відповідних параметрів конфігурації), так що різні проекти можуть отримувати потрібні версії залежностей, не наступаючи один на одного. Це домовленістьДокументація встановити cabal означає "локальні побудови в стилі Nix" .
На запит створити проект, стек буде замість того, щоб їхати в Hackage, шукати resolver
поле stack.yaml
. У робочому процесі за замовчуванням це поле вказує знімок стека , який є підмножиною пакетів Hackage з фіксованими версіями, які, як відомо, є сумісними. стек буде намагатися задовольнити залежності , зазначені в файлі (або , можливо , в файл - інший формат, ту ж роль) , використовуючи тільки те , що забезпечується моментальний знімок. Пакети, встановлені з кожного знімка, реєструються в окремих базах даних, які не заважають один одному..cabal
project.yaml
Можна сказати, що підхід до стеку обробляє деяку гнучкість у налаштуванні для прямолінійності, коли мова йде про визначення конфігурації збірки. Зокрема, якщо ви знаєте, що ваш проект використовує, скажімо, знімок LTS 15.3, ви можете перейти на його сторінку стека і знати, на перший погляд, версії будь-якого стека залежностей, які можуть витягуватися із стека. Однак, обидва інструменти пропонують функції, що виходять за рамки базових робочих процесів, так що, за великим рахунком, кожен може робити все, що робить інший (хоча можливо і менш зручним способом). Наприклад, є способи заморозити точні версії відомої гарної конфігурації збірки та вирішити залежності зі старим станом Hackage за допомогою cabal -install, і під час використання стека можна зажадати залежностей, що не укладаються, або змінити версії пакетних знімків .
Нарешті, ще одна відмінність між встановленням кабала та стеком, яка є достатньо великою, що варто згадати в цьому огляді, полягає в тому, що стек має на меті забезпечити повне середовище побудови з такими функціями, як автоматичне управління встановленням GHC та інтеграція Докера . На відміну від цього, програма cabal встановлюється як ортогональна для інших частин екосистеми, і тому вона не намагається надати такий тип функції (зокрема, версії GHC повинні встановлюватися та керуватися окремо, будь то через Linux Linux пакети, ядро Haskell Platform в Windows або інструмент ghcup ).
cabal-install
та використовує стек - в певний момент може бути певна інтеграція в cabal-install, і я думаю спільнота не впевнена, це добре чи ні, бо це може розколоти спільноту)