2016-12-30 5 views
1

В моем понимании (1), что раздел build-depends в файле моего проекта .cabal гарантирует, что пакеты, указанные там, присутствуют в преобразователе, указанном в stack.yml, доступны (в соответствующих версиях) и используются, когда я тестирую или запускаю свой пакет (например, с stack ghci или stack test и т. д.).Зачем «строить» пакет вместо использования «лишних депо» в «stack.yml»?

Я также собираю (2), что раздел extra-deps моего stack.yml используется для приобретения пакетов, которые не находятся в указанном распознавателе.

Но я запутался о роли

stack build some-package 

Как это отличается от extra-deps? Будет ли использоваться some-package, когда я stack test или stack ghci и т. Д.? Зачем использовать его вместо добавления some-package в extra-deps? (И, есть ли у меня (1) и (2) правильно?)

ответ

1

Основная цель команды build - фактически инициировать сборку, то есть компиляцию. По умолчанию stack build построит все «локальные» пакеты, перечисленные в разделе stack.yamlpackages. Если передать имя пакета в качестве аргумента build, который имеет обычно одну из следующих двух целей:

  1. Вы хотите построить только определенный (локальный) пакет в проекте мульти-пакет
  2. Или вы вы хотите установить исполняемый файл из нелокального пакета, например hlint. Обычно вы будете делать это с stack install PKG, который является ярлыком для stack build --copy-bins PKG.

Одно ядро ​​Принцип конструкции стека, который строит должны быть воспроизводимыми, т.е. проект с тем же кодом и той же конфигурации всегда должны давать один и тот же результат для stack build.

Это означает, что stack build или stack install никогда не изменит конфигурацию проекта или не добавит зависимости к проекту.

Для получения дополнительной информации о команде build, взгляните на the relevant docs.

+0

Так что, если я 'stack build PKG', PKG не влияет на то, что' stack build' (с использованием проектов '.cabal' и' stack.yml') или 'stack ghci' или' stack test' видят? – orome

+0

Да, это так. – sjakobi

+0

Прохладный. Это кажется магическим: я не вижу, как выходы (установленные пакеты, например) из 'stack build PKG' и' stack build' разделены? Делает ли это просто уничтожение другого? – orome