問題タブ [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.
haskell - Shake で固定小数点ビルド ルールを記述する方法 (例: Latex)
Shake Haskell ビルド ライブラリを使用して、固定点に到達する必要があるプログラムを使用してルールを作成するにはどうすればよいですか? foo
ファイルinput
を取得して出力ファイルを生成するプログラムがありfoo
、出力ファイルが変更されなくなるまで繰り返し適用する必要があると想像してください。Shakeでそれをどのように書くことができますか?
このパターンの典型的な例が LaTeX です。
shake-build-system - Shakeでカスタムルールを定義する方法:Development.Shake.Coreは非表示になっています
非常に有望に見えるシェイクを使おうとしていますが、小さな壁にぶつかりました。私はhaskellにまったく慣れていないので、明らかな何かが欠けているかもしれませんが、ここに私の問題があります:
シェイクプログラムで新しい種類のルールを定義したいと思います。このルールは、依存関係から値を計算し、それをshakeにデータベースに保存させます。したがって、依存関係が最新の場合、shakedb値は常に有効です。
しかし、私import Development.Shake.Core
がしようとすると
そして、私がそれをインポートしない場合、私は持っています
では、どうすれば新しいルールを定義できるでしょうか。
ボーナスの質問は次のとおりです。私のアイデアは興味深いですか、それともそれを行うためのより良い方法がありますか?シェイクの使い方を考えると、この振る舞いをするルールがたくさんありました。これにより、一時ファイルが大量に発生するのを防ぎ、シェイクデータベースを利用できます。実際、私の次のステップは、「ファイルシステムフリールール」の一般的なルールを定義することです。ユーザーはkey → Maybe (Action value)
関数を提供する必要があります。
shake-build-system - システムのアクションを追加すると、ルール履歴が変更されます
私にはこの種のルールがあります:
正しくビルドされており、ビルドを2回実行してもターゲットはビルドされません。次に、このルールにシステムを追加します。
依存関係が変更されていないため、shakeを実行しても「foo」ターゲットは再構築されません。とにかく、ルールが変わりました。したがって、新しく追加されたシステムのアクションによってルールの履歴が変更され、「foo」の再構築が強制されることを期待していますが、そうではありませんでした。通常、autoconf / automakeシステムでは、または重要なmakefileでも、ルールはMakefile自体に依存しているため、Makefileが変更されるたびに、プロジェクトが再構築されます。Shakeでは、これが機能し、きめが細かいことを期待しています。
システムのソースコードでは、実行中のコマンドに暗黙の依存関係を追加するものは何も表示されません。
私は何か間違ったことをしていますか?この種の依存関係をサポートしないことは意図的ですか、それとも単に実装されていませんか?
shake-build-system - Shake を構成ツールとして拡張することは可能でしょうか?
パペット/シェフの流れで。Shake をローカル ビルド以外にも使用したいと考えています。Shake の原則は十分に抽象的であり (詳しくは知りませんでしたが)、より大規模な構成構築ツールの基盤として使用できると思います。
haskell - PHONYターゲットをシェイクを使用したデフォルトアクションとしてどのように宣言しますか?
MakefileをShakefileに変換している最中ですが、PHONY makeターゲット(、など)を処理する方法がわかりませclean
んinstall
。私は次のようなことを試しました:
シンボリックリンクの作成は成功しますが、「エラー、ルール「インストール」はファイルのビルドに失敗しました:インストール」というエラーが報告されます。
それで、「欲しい」アクションがない場合、実行したいデフォルトのターゲットが偽のターゲットであることをどのように宣言しますか?
haskell - Shake による多入力多出力コンパイラ
私はShakeを使用して Java コードをビルドする実験を行っていますが、javac コンパイラの異常な性質のために少し行き詰っています。一般に、大規模なプロジェクトの各モジュールでは、そのモジュールのすべてのソース ファイルを入力としてコンパイラが呼び出され、1 回のパスですべての出力ファイルが生成されます。その後、通常、コンパイラによって生成された .class ファイルを取得し、それらを JAR (基本的には単なる ZIP) にアセンブルします。
たとえば、典型的な Java モジュール プロジェクトは次のように配置されます。
- 複数の .java ファイルを含む
src
ディレクトリ。そのうちのいくつかは、ツリー内の何層にもネストされています。 - コンパイラからの出力を含む
bin
ディレクトリ。通常、この出力は同じディレクトリ構造とファイル名に従い、.class
各 .java ファイルが置き換えられますが、マッピングは必ずしも 1 対 1 であるとは限りません。
したがって、シェイクで定義したいルールは次のとおりです。
1)下のファイルが下のどのファイルよりもsrc
新しい場合は、すべての内容を消去し、次のように再作成します。bin
bin
javac -d bin <recursive list of .java files under src>
この規則が過剰に思えることはわかっていますが、コンパイラーを起動しないと、単一の入力ファイルのわずかな変更によって生じる出力の変化の程度を知ることはできません。
2)以下のいずれかのファイルがそれbin
よりも新しい場合は、次のようmodule.jar
に再作成module.jar
します。
jar cf module.jar -C bin .
どうもありがとう!
PS「Ant/Maven/Gradle/を使用するだけ」という静脈内の応答は高く評価されません! これらのツールがすぐに使える Java コンパイルを提供することは知っていますが、それらを作成して集約するのははるかに困難です。これが、私が Haskell/Shake ベースのツールを試してみたい理由です。
haskell - Shake ライブラリを使用してリアクティブ ビルド システムを構築するにはどうすればよいですか?
inotify (または git-annex と Yesod が使用するもの) を使用して Shake を反応的にすることは可能でしょうか? ファイルシステムがそのルールを実行する必要があることを暗示するような方法で変更された場合、それはできるだけ早い機会に変更されますか?
shake-build-system - Shake: ルールが変更され、シェイク データベースと同期しなくなったときに、確実に、自動的に再構築を強制する方法は?
シェイクにはshakeVersion :: String
:
デフォルトは 1 です。ビルド規則のバージョン番号。ワイプが必要なルールに大幅な変更を加える場合など、バージョン番号を変更して完全な再構築を強制します。バージョン番号はソース コードで設定する必要があり、コマンド ラインでは渡されません。
ビルド システムを少し改善しても、それらがワイプを必要とする重要な変更であることに気付かないことは信じられないほど簡単です。それらをバージョン管理経由で配布すると、同僚や継続的インテグレーション ボットのビルドが正しくない可能性があります。
を削除して自分のビルドを修正しています.shake.database
が、これを会社全体に伝えるのは楽しくありません。
これを自動的に処理するにはどうすればよいですか?
haskell - Shake ビルド システムで .exe 拡張子を条件付きで使用する
すばらしい Shake ビルド システムを使用して、ホスト オペレーティング システムに依存しない方法でプロジェクトをコンパイルしたいと考えています。
システム間で拡張子が異なるため、バイナリの存在を検出するのに問題があります (つまり、Windows は を使用します.exe
)。
句を使用してneed
必要なバイナリが存在するかどうかを検出する場合、ホストが Linux か Windows かMain
を確認するにはどうすればよいですか?Main.exe