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 コードを変更するとバージョンが自動的に変更されるため、手動で変更することを心配する必要はありません。


更新:以下をもう少し簡単に実行できる機能getHashedShakeVersionが追加されました。shake

于 2013-08-30T12:07:28.220 に答える