Mavenに似たHaskellビルドおよびアーティファクト環境


20

私は以前からJava開発者でしたが、最近、Haskellチームに参加しました。Javaの世界では、複数のチームが取り組んでいる大規模なプロジェクトがある場合、Mavenなどのアーティファクトサーバーを使用して開発を容易にし、スピードアップするのが一般的なアプローチです。Ant、Maven、Gradleなどの多数のビルドツールを使用してプロジェクトをビルドし、jarファイルをアーティファクトサーバーにアップロードして、チームの残りのメンバーが簡単に使用できます。したがって、プロジェクトをより小さなサブプロジェクトに分割することにより、ビルド時間も大幅に短縮されます。

Haskell側ではcabal、プロジェクトのビルドに使用しています。このプロジェクトは、最適化なしでビルドするのに約10〜15分かかります。コンパイラーの最適化がオンになっている場合、数時間かかりますが、これは苦痛です。

ここでJavaで行うのと同じことをどのように行うことができるのでしょうか。パッケージ(ライブラリ)のバイナリをコンパイルしてアーティファクトサーバーにアップロードし、ビルド時にビルド済みのバイナリを使用する簡単な方法はありますか?Haskellは(Javaのバイトコードではなく)マシンコードを生成するため、互換性の問題があるかもしれませんが、アーティファクトサーバーに格納されているアーキテクチャ/ OSごとに異なるバイナリを使用できる可能性があります。


あなたの質問に対する答えではありませんが、-jオプションを使用して「cabal build / install」を呼び出しますか?
ダニエルディアスカレテ

はい、しかし、あまり高速化は見られません。ビルド時のCPU使用率は約15%〜20%です。:私は、問題がどこにあるかわからないcabalGHCTest.Frameworkまたはリンカー。
オキシ

このSOの回答stackoverflow.com/questions/27173910/…によると、主な理由はHaskell実行可能ファイルのネイティブな性質です。
ダニエルディアスカレテ

私は主に開発について話しています。OS、CPUアーキテクチャ、さらにはコンパイラのバージョンが異なるため、バイナリが非互換性を引き起こす可能性があるのは事実です。しかし、同じマシン、同じOS、同じコンパイラで毎日開発しているのに、なぜそんなに時間を無駄にする必要があるのでしょうか?
オキシ

これは便利かもしれませんキャッシュとハルシオンのようになります。halcyon.sh/reference/#private-storage-options
ルボミールSedlář

回答:


2

Nixを使用することを検討してください。これは、Haskellを適切にサポートする汎用のクロスプラットフォームパッケージマネージャーです。

Nixには、パッケージを定義するためのカスタムプログラミング言語があります(これはたまたま純粋で、機能的で、怠zyです)。新しいパッケージの定義と既存のパッケージの拡張は非常に簡単です(たとえば、依存関係を変更したり、別のgitリポジトリからソースを取得したりするなど)。

パッケージは、依存関係を含むハッシュによって識別されます。したがって、複数のバージョン、または異なる依存関係を持つ同じバージョンは、競合することなく共存できます。Nixは、「バイナリキャッシュ」サーバーで目的のハッシュを検索して、特定の依存関係を持つ特定のパッケージが既にビルドされているかどうかを確認できます。その場合、コンパイルするのではなくビルド製品をダウンロードします。

現在、nixpkgsリポジトリには、Hackageのほとんど/すべて、いくつかのGHCバージョン(7.10.1、7.8.4、およびいくつかのJSバックエンド)、およびcabal2nix.cabalファイルからNixパッケージを生成する非常に良い仕事をするユーティリティが含まれています。Nixベースの「hydra」CIサーバーもあり、SCMコミットに基づいてビルドをトリガーするために使用できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.