cabal: как автоматично да актуализирам полето build-depends във файла .cabal?

Има ли начин за автоматично актуализиране на полето build-depends в .cabal-файла? Например, ако започнем със следния .cabal файл:

name:           HUnit
version:        1.1.1
synopsis:       A unit testing framework for Haskell
homepage:       http://hunit.sourceforge.net/
category:       Testing
author:         Dean Herington
license:        BSD3
license-file:   LICENSE
cabal-version:  >= 1.10
build-type:     Simple

library
  build-depends:      base >= 2 && < 4
  exposed-modules:    Test.HUnit.Base, Test.HUnit.Lang,
                      Test.HUnit.Terminal, Test.HUnit.Text, Test.HUnit
  default-extensions: CPP

След това инсталирайте пакет:

cabal install warp

Сега трябва да добавя warp >=3.0 && <3.1 към полето build-depends, за да изглежда файлът така:

name:           HUnit
version:        1.1.1
synopsis:       A unit testing framework for Haskell
homepage:       http://hunit.sourceforge.net/
category:       Testing
author:         Dean Herington
license:        BSD3
license-file:   LICENSE
cabal-version:  >= 1.10
build-type:     Simple

library
  build-depends:      base >= 2 && < 4, warp >=3.0 && <3.1
  exposed-modules:    Test.HUnit.Base, Test.HUnit.Lang,
                      Test.HUnit.Terminal, Test.HUnit.Text, Test.HUnit
  default-extensions: CPP

Въпросът ми е: как да актуализираме този файл автоматично?


person Marcus Vinícius Monteiro    schedule 14.05.2015    source източник
comment
emacs haskell-mode прави това за мен, но не знам за общо решение.   -  person Rein Henrichs    schedule 15.05.2015
comment
@ReinHenrichs Мисля, че кодът за функцията, която споменахте, е този haskell-mode в github, потърсете defun haskell-cabal-section-add-build-dependency. Чудя се дали сътрудниците на кабала са направили нещо подобно.   -  person Marcus Vinícius Monteiro    schedule 15.05.2015
comment
Автоматично? Въз основа на какво? Със сигурност не искате ВСИЧКИ ваши инсталирани пакети във вашата компилация зависи?   -  person Cubic    schedule 15.05.2015
comment
@Cubic Вземете например yesod-core .cabal файла. Списъкът зависи от изграждането на 47 пакета, някои с ограничения на версията. Трябваше ли авторът да ги включи всички на ръка, като ги напише сам във файла .cabal, или cabal му помогна с това?   -  person Marcus Vinícius Monteiro    schedule 15.05.2015
comment
Вероятно са добавени на ръка. Можете да видите историята на този файл в GitHub: github .com/yesodweb/yesod/commits/master/yesod-core/   -  person Taylor Fausak    schedule 15.05.2015
comment
@TaylorFausak Благодаря, но откъде знаеш, че промените са добавени на ръка?   -  person Marcus Vinícius Monteiro    schedule 15.05.2015
comment
Аз не. Предполагам въз основа на моя опит с файловете на Cabal в собствените ми проекти.   -  person Taylor Fausak    schedule 15.05.2015
comment
Също така си струва да се отбележи, че Cab (обвивка около Cabal) не имат тази функция. Има обаче проблем за него.   -  person Taylor Fausak    schedule 15.05.2015


Отговори (2)


В съвременния cabal-install има два инструмента за подпомагане при управлението на границите на зависимостите. Първият е gen-bounds, който предлага подходящи диапазони на версиите за пакети въз основа на спецификациите на текущо инсталираните версии. Второто е outdated, което изброява зависимостите във файла cabal, за които съществуват по-нови версии на hackage. И двете са документирани в ръководството на Cabal: https://www.haskell.org/cabal/users-guide/developing-packages.html#generating-dependency-version-bounds

person sclv    schedule 06.02.2018

Възможна алтернатива е да използвате hpack, yaml, sponge и jq:

Ще ви е необходим файл hpack package.yaml.

Например, за да добавите aeson като зависимост:

cp package.yaml package.yaml.backup && (yaml2json package.yaml | jq '.dependencies += ["aeson"]' | json2yaml | sponge package.yaml ) && hpack
person Chris Stryczynski    schedule 26.02.2018