Shake
使用方法と新しいルールの作成方法を理解しようとしています。backup
演習として、ルールと呼ばれるものを実装することにしました。
アイデアは、ファイルが存在しない場合、またはファイルが古すぎる場合 (24 時間以上) にファイルを生成することです。長いコマンドをメイクファイルに保存して、必要に応じて実行するのが好きです。例は mysql バックアップです。唯一の問題は、バックアップが既に存在し、make
何もしない場合です。これを解決するには、次のいずれかを実行できます
- 新しいバックアップをやり直す前に、以前のバックアップを削除します。
- バックアップ対象にする
phony
- 架空の
force
依存関係を追加します。手動または cron で変更できます。
私が望むのは、バックアップが24時間以上経過している場合はバックアップをやり直すことです(これtouch force
はcronで実行できます)。とにかく、それはで遊ぶための単なる例Shake
です。私が欲しいのは次のようなものです:
expirable "my_backup" 24 \out -> do
cmd "mysqldump" backup_parameter out
ドキュメントを読みましたが、これを行う方法やルールを定義する方法、および an とは何かがわかりませんAction
。クラスをインスタンス化する必要があることは理解していますが、Rule
何が何であるかわかりません。
明確化
バックアップを自動的に実行するのではなく、オンデマンドでのみ実行したいのですが、最大で 24 時間に 1 回です。
シナリオの例として、リモート マシンに実稼働データベースがあり、ローカル コピーがあり、時間のかかるレポートをローカルで実行しています。通常のワークフローは
- 本番バックアップをダウンロード
- それを使用してローカルデータベースを更新します
- ローカル倉庫データベースに非正規化テーブルをいくつか作成する
- レポートを生成します。
レポートは毎日実行するのではなく、必要なときだけ実行します。そのため、24 時間ごとにレポートを実行したくありません。タイミング ビットを除いてメイクファイルを使用するのは簡単です。それらは面倒ですが、シェイクがどのように機能するかを深く理解するための不自然な例です。
したがって、最初make report
にバックアップを実行すると、データベースがすべて実行され、レポートが生成されます。ここで、レポートを変更したいと思います (テスト中のため)。バックアップを再生成する必要はありません(ローカルデータベースを更新する必要もありません)(私たちは夕方であり、翌日まで本番環境で何も変更されていないことを知っています)
そして翌日、または翌月、レポートを再実行します。今回は、バックアップを再度実行する必要があり、その依存関係もすべて再実行する必要があります。
基本的に私が必要とするルールは代わりに
やり直しタイムスタンプ = タイムスタンプ < 古い
は
やり直しタイムスタンプ = タイムスタンプ < 古い || 現在 > タイムスタンプ + 24*36000
しかし、このルールをどこに置くべきかわかりません。
問題は、それをどのように書くかではなく、どこに置くかです(上にあります)。(説明するのが)簡単な場合は、ユーザー(getLine)に「このターゲットをやり直しますか(はい/いいえ)?」と尋ねるルールを作成できます。
後で、データベース (または特定のテーブル) の最終更新に応じたルールも必要になります。データベースから情報を取得する方法は知っていますが、Shake に統合する方法はわかりません。
私はaが何であるかと混乱するかもしれませんRule
。ルールを作るということは、ターゲットをどのように作るか (つまり、よりレシピ的なものです)、または Shake のアクションであると私が考えるものです。どこにルールがあるかというと、どうやってリメイクするかではなく、リメイクするかしないかを決めるルールのことです。make では、選択の余地がないので (タイムスタンプです)、そのような概念はありません。