奶昔有shakeVersion :: String
:
默认为 1。构建规则的版本号。更改版本号以强制完全重建,例如在对需要擦除的规则进行重大更改时。版本号应该在源代码中设置,而不是在命令行中传递。
稍微改进构建系统非常容易,并且不会注意到它们是需要擦除的重大更改。如果您通过版本控制分发它们,可能会导致我的同事和我的持续集成机器人的构建不正确。
虽然我通过删除来修复自己的构建,但将.shake.database
其传达给整个公司并不有趣。
我怎样才能自动处理这个?
奶昔有shakeVersion :: String
:
默认为 1。构建规则的版本号。更改版本号以强制完全重建,例如在对需要擦除的规则进行重大更改时。版本号应该在源代码中设置,而不是在命令行中传递。
稍微改进构建系统非常容易,并且不会注意到它们是需要擦除的重大更改。如果您通过版本控制分发它们,可能会导致我的同事和我的持续集成机器人的构建不正确。
虽然我通过删除来修复自己的构建,但将.shake.database
其传达给整个公司并不有趣。
我怎样才能自动处理这个?
这是我在https://github.com/ndmitchell/shake/issues/59中设法提出的;在 stackoverflow 上发现它可能比在已关闭的问题中更容易:
假设我的 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