問題タブ [shake-build-system]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
shake-build-system - Shake はターゲットを再構築するかどうかをどのように決定しますか?
出力を再構築する必要があるかどうかを判断するためにShakeが使用するルールについて、私は混乱しています。2 つのステップでドキュメントを作成する簡単なビルドがあります。完全なビルド ファイルを以下に示しますが、要約すると、asciidoc
を使用して.txt
ファイルを.dbxml
(Docbook XML) ファイルに変換し、次に を使用して PDF に変換しdblatex
ます。
PDF に触れてシェイクを再実行しても、出力は両方の入力よりも新しいため、何も起こらないはずです。ただし、実際には、shake は dblatex ステップを実行します。
次に、.dbxml
ファイルに触れると、shake は dblatex を実行しますが、asciidoc は実行しないと予想します。これは、dbxml がその入力 (つまり.txt
) よりも新しいためです。ただし、shake は実際には asciidoc と dblatex の両方のステップを実行します。
依存関係を間違えましたか?
haskell - Haskell ファイルへの変更を追跡するには「ghc --make」が必要であることを Shake にどのように通知すればよいですか?
シェイクと併用のおすすめの使い方が知りたいghc --make
。私のプロジェクトでは、シェイク ルールを使用して C ソース コードを*.o
ファイル (私は と呼びますcobjects
) にコンパイルし、これらのオブジェクトは を呼び出すことによって、私の haskell プログラムに一緒にリンクされghc --make
ます。このコマンドの実行中ghc
に、haskell ファイルを再構築する必要がある時期を自動的に判断します。
以下の例は、2 つのツールを統合するように正しく記述されていません。ファイルが変更された場合.hs
、shake スクリプトを再実行しても は再起動されませんghc --make
。シェイクが再構築を知らない理由は理解できますが、推奨される修正方法はわかりません。
shake-build-system - デフォルトに相当するものは何ですか:Shakeで
小さなプロジェクトで Make の代わりに Shake を使用しようとしています。現在、主にシェル コマンドのエイリアシングに使用されています。デフォルトの偽のアクションを指定する方法はありますか? デフォルトに似たもの:メイクファイル内。たとえば、次のようになります。
ターゲットが指定されていない場合、アクションを実行することを宣言したいと思いbuild
ます。
haskell - Shake ルールでソース ファイル名を復元する
次のように機能する静的Webサイトのビルドシステムを作成しています。
- すべてのファイルに対してファイル
src/123-some-title.txt
を生成しますout/123.html
私の問題は、ルールを作成するときに、ターゲット ファイル名out/*.html
( ) からソース ファイル名 ( ) を復元する直接的な方法がないことです。src/123-some-title.txt
out/123.html
もちろん、src/
ディレクトリをもう一度読み込んで で始まるファイルを検索することもできます123
が、シェイクでこれを行うより良い方法はありますか?
haskell - Shake を使用して sh コマンドを実行する方法
既存のメイクファイルを Shake に移行しようとしていますが、これまでのところ次のことを試しました (ディレクトリの内容を含むファイルを作成するだけです)。
実行すると、次のエラー メッセージが表示されます。
私は何を間違っていますか?sh
コマンドを実行し、その出力をリダイレクトするにはどうすればよいですか?
haskell - Shake でタイマー ルールを定義する方法
Shake
使用方法と新しいルールの作成方法を理解しようとしています。backup
演習として、ルールと呼ばれるものを実装することにしました。
アイデアは、ファイルが存在しない場合、またはファイルが古すぎる場合 (24 時間以上) にファイルを生成することです。長いコマンドをメイクファイルに保存して、必要に応じて実行するのが好きです。例は mysql バックアップです。唯一の問題は、バックアップが既に存在し、make
何もしない場合です。これを解決するには、次のいずれかを実行できます
- 新しいバックアップをやり直す前に、以前のバックアップを削除します。
- バックアップ対象にする
phony
- 架空の
force
依存関係を追加します。手動または cron で変更できます。
私が望むのは、バックアップが24時間以上経過している場合はバックアップをやり直すことです(これtouch force
はcronで実行できます)。とにかく、それはで遊ぶための単なる例Shake
です。私が欲しいのは次のようなものです:
ドキュメントを読みましたが、これを行う方法やルールを定義する方法、および an とは何かがわかりませんAction
。クラスをインスタンス化する必要があることは理解していますが、Rule
何が何であるかわかりません。
明確化
バックアップを自動的に実行するのではなく、オンデマンドでのみ実行したいのですが、最大で 24 時間に 1 回です。
シナリオの例として、リモート マシンに実稼働データベースがあり、ローカル コピーがあり、時間のかかるレポートをローカルで実行しています。通常のワークフローは
- 本番バックアップをダウンロード
- それを使用してローカルデータベースを更新します
- ローカル倉庫データベースに非正規化テーブルをいくつか作成する
- レポートを生成します。
レポートは毎日実行するのではなく、必要なときだけ実行します。そのため、24 時間ごとにレポートを実行したくありません。タイミング ビットを除いてメイクファイルを使用するのは簡単です。それらは面倒ですが、シェイクがどのように機能するかを深く理解するための不自然な例です。
したがって、最初make report
にバックアップを実行すると、データベースがすべて実行され、レポートが生成されます。ここで、レポートを変更したいと思います (テスト中のため)。バックアップを再生成する必要はありません(ローカルデータベースを更新する必要もありません)(私たちは夕方であり、翌日まで本番環境で何も変更されていないことを知っています)
そして翌日、または翌月、レポートを再実行します。今回は、バックアップを再度実行する必要があり、その依存関係もすべて再実行する必要があります。
基本的に私が必要とするルールは代わりに
やり直しタイムスタンプ = タイムスタンプ < 古い
は
やり直しタイムスタンプ = タイムスタンプ < 古い || 現在 > タイムスタンプ + 24*36000
しかし、このルールをどこに置くべきかわかりません。
問題は、それをどのように書くかではなく、どこに置くかです(上にあります)。(説明するのが)簡単な場合は、ユーザー(getLine)に「このターゲットをやり直しますか(はい/いいえ)?」と尋ねるルールを作成できます。
後で、データベース (または特定のテーブル) の最終更新に応じたルールも必要になります。データベースから情報を取得する方法は知っていますが、Shake に統合する方法はわかりません。
私はaが何であるかと混乱するかもしれませんRule
。ルールを作るということは、ターゲットをどのように作るか (つまり、よりレシピ的なものです)、または Shake のアクションであると私が考えるものです。どこにルールがあるかというと、どうやってリメイクするかではなく、リメイクするかしないかを決めるルールのことです。make では、選択の余地がないので (タイムスタンプです)、そのような概念はありません。
shake-build-system - Shake でコンソールの進行状況メッセージを表示する
wget
ファイルをダウンロードするために呼び出して、シェイクを使用しています。コマンド ラインでこれを行うと、1 行のプログレス バーが表示されますが、Shake から呼び出すと、多数のドットの行が表示されます。例として:
1行の進行状況バーを表示したいと思います。