3

奶昔有shakeVersion :: String

默认为 1。构建规则的版本号。更改版本号以强制完全重建,例如在对需要擦除的规则进行重大更改时。版本号应该在源代码中设置,而不是在命令行中传递。

稍微改进构建系统非常容易,并且不会注意到它们是需要擦除的重大更改。如果您通过版本控制分发它们,可能会导致我的同事和我的持续集成机器人的构建不正确。

虽然我通过删除来修复自己的构建,但将.shake.database其传达给整个公司并不有趣。

我怎样才能自动处理这个?

4

1 回答 1

2

这是我在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 代码时,版本将自动更改,我不必担心手动碰撞它。


更新:现在有一个功能可以更轻松地执行以下操作getHashedShakeVersionshake

于 2013-08-30T12:07:28.220 回答