以前はJava開発者でしたが、最近Haskellチームに参加しました。Javaの世界では、大規模なプロジェクトの場合、いくつかのチームが取り組んでいますが、一般的なアプローチは、Mavenなどのアーティファクトサーバーを使用して開発を容易かつ高速化することです。Ant、Maven、Gradleなどの多数のビルドツールは、プロジェクトをビルドしてjarファイルをアップロードできますチームの他のメンバーが苦労せずに使用できるアーティファクトサーバーに変換するため、プロジェクトを小さなサブプロジェクトに分割することで、ビルド時間も大幅に短縮されます。
Haskell側では、cabal
を使用してプロジェクトをビルドしています。私たちのプロジェクトは、最適化なしでビルドするのに約10-15分かかります。コンパイラの最適化をオンにすると、数時間かかります。
Javaここで行うのと同じことをどのように行うことができるのでしょうか。パッケージ(ライブラリ)のバイナリをコンパイルしてArtifactサーバーにアップロードし、それを使用する簡単な方法はありますか?ビルド時にビルド済みのバイナリ?Haskellが(Javaのバイトコードではなく)マシンコードを生成するため、互換性の問題があるかもしれませんが、アーティファクトサーバーに格納されているアーキテクチャやOSごとに異なるバイナリが存在する可能性があります。
Nix の使用を検討するかもしれません。これは、Haskellを適切にサポートする、汎用のクロスプラットフォームパッケージマネージャーです。
Nixには、パッケージを定義するためのカスタムプログラミング言語があります(これは、たまたま純粋で機能的で遅延しているためです)。新しいパッケージの定義と既存のパッケージの拡張は非常に簡単です(たとえば、依存関係を変更する、別のgitリポジトリからソースを取得するなど)。
パッケージは、依存関係を含むハッシュで識別されます。したがって、複数のバージョン、または異なる依存関係を持つ同じバージョンが、競合することなく並んで存続できます。 Nixは、「バイナリキャッシュ」サーバーで目的のハッシュを検索し、特定の依存関係を持つ特定のパッケージがすでにビルドされているかどうかを確認できます。その場合、コンパイルではなくビルド製品をダウンロードします。
現在、nixpkgsリポジトリには、Hackageのほとんど/すべて、いくつかのGHCバージョン(7.10.1、7.8.4、および一部のJSバックエンド)、および.cabalファイルからNixパッケージを生成するための非常に優れたcabal2nix
ユーティリティが含まれています。 SCMコミットに基づいてビルドをトリガーするために使用できるNixベースの「hydra」CIサーバーもあります。