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
что позволяет сделать ниже немного легче.