Shake: Как надежно, автоматически форсировать пересборку, когда мои правила меняются, и не синхронизироваться с базой данных Shake?

Shake имеет shakeVersion :: String:

По умолчанию 1. Номер версии ваших правил сборки. Измените номер версии, чтобы принудительно выполнить полную перестройку, например, при внесении значительных изменений в правила, требующие удаления. Номер версии должен быть установлен в исходном коде, а не передаваться в командной строке.

Невероятно легко немного улучшить систему сборки и не заметить, что это были значительные изменения, которые требуют вайпа. Если вы распространяете их через систему контроля версий, это может привести к неправильной сборке моих коллег и моего бота Continuous Integration.

Пока я исправляю свою сборку, удаляя .shake.databaseРассказывать об этом всей компании не весело.

Как я могу справиться с этим автоматически?

1 ответ

Решение

Это то, что мне удалось придумать в https://github.com/ndmitchell/shake/issues/59; Вероятно, легче обнаружить это в stackru, чем в закрытом выпуске:


Давайте предположим, что мои правила Shake в Build.hs,

Я использую хэш Build.hs сам как shakeVersion:

{-# LANGUAGE TemplateHaskell #-}

import qualified Data.ByteString as BS
import Development.Shake.Classes (hashWithSalt)
import Language.Haskell.TH

-- | The name of this file we are in.
_THIS_FILE_NAME :: String
_THIS_FILE_NAME = $(LitE . StringL . loc_filename <$> location)

main = do
  checksum <- dropWhile (== '-') . show . hashWithSalt 0 <$> BS.readFile _THIS_FILE_NAME

  shakeArgs shakeOptions
      { shakeVersion = "hash-" ++ checksum ++ "-" ++ _THIS_FILE_NAME
      } $ do ...

Таким образом, версия будет автоматически изменена, когда я изменю свой код Shake, и мне никогда не придется беспокоиться о том, чтобы изменить его вручную.


ОБНОВЛЕНИЕ: теперь есть функция getHashedShakeVersion в shake что позволяет сделать ниже немного легче.

Другие вопросы по тегам