2017-12-27 34 views
1

私はローカルの両方を生成Haskellのプロジェクト、執筆していますスタックを使用して、グローバルに使用するためにローカルに作成されたHaskellモジュールをインストールするにはどうすればよいですか?

  1. バイナリ実行ファイルを、そして私がしたい
  2. いくつかの新しいHaskellのモジュールは、私の他、Haskellのもと、実行可能ファイルへのアクセス可能。

後:

stack build 
stack install 

私はそれを見つけることだ:

  1. バイナリ実行(#1を、上記)は、任意のディレクトリから、うまく動作します。
  2. しかし、新しいHaskellモジュール(上記の#2)は、私がプロジェクトディレクトリ内から実行しているときにのみ見つかります! (すなわち、上記の#1以外の実行ファイルについて)

どこからでも新しいモジュールを見つける必要があります。 これをどうすれば実現できますか?

+0

[この質問はほんの数時間前です](https://stackoverflow.com/questions/47989939/is-there-a-declarative-way-to-specify-packages-to-be-installed- global-projeへ)、そこに好きなようにスタックの代わりにCabal-installを使うことをお勧めします。モジュールをグローバルにインストールすることについて心配する必要はありません。 – leftaroundabout

+0

ご意見ありがとうございます。はい、「cabal install」は私の問題を解決しました。しかし、今では2つの別々の、並行した、大部分の冗長なHaskellインストールがハードドライブスペースを噛み砕いてしまいました。それはひどく無駄で不要なようです。私が作り出しているバイナリ実行可能ファイルは、どんなディレクトリからでもうまく動作できるので、特に怒っています。新しいHaskellモジュールを私のシステムのどこからでも(インポートしてから)見つける方法を知っていることを意味します。ですから、なぜ私はこれらの新しいモジュールを他のHaskell実行可能ファイルにも利用できないのですか? – dbanas

+0

これは絶対に不要なので、私はラップトップに_only_ Cabal-installを、TravisにはStackだけを使用しています。 - 実行ファイルがインポートされたモジュールを見つける方法は、コンパイラがソースファイルに対してどのようにそれらを見つけるかとは非常に異なります。実際には、静的にリンクすると、すべてのものが既にバイナリに含まれているため、必要なものはありません。動的にリンクすると、特定のハッシュされたダイナミックライブラリファイルへのハードコードされたパスを検索しますが、これはバージョンリゾルバとリンカが以前の作業を完了したためにのみ機能します。 – leftaroundabout

答えて

1

各スタックプロジェクトは独自のサンドボックス内にあるため、コンパイルされたモジュールはそのプロジェクト内でのみ使用できます。スタックされたスナップショットに由来するコンパイルされた依存関係は、プロジェクト間で共有されることがあります。

パッケージリストに相対パスを指定し、このパッケージをポイントすることができます。それは再びビルドされますが、この方法で別のプロジェクトで直接使用できます。なぜ余分な建物? Stackはcabal-installとは異なるプロジェクトモデルを持っています。これは、パッケージDBへの突然変異が他のプロジェクトの構築方法に影響を与えることを許しません。

このようなパッケージを共有するための1つのオプションは、git repoで使用し、https://docs.haskellstack.org/en/stable/custom_snapshot/を使用することですが、そのようなものはまだ少し新しくなっています。

+0

お返事ありがとうございます。だから、あなたが言っていることを理解すれば、ダイナミックなプラグインスタイルのカスタマイズを使用するHaskell実行可能ファイルで使用するために構築されたモジュールのように思えます。代わりにカバールでビルド/インストールする必要があります。それは公正な要約ですか? – dbanas

+0

ああ、モジュールを動的に読み込もうとしていたことは分かりませんでした。プロジェクトで "stack build pkg-x"を実行すると、モジュールは 'stack exec'によって設定されたGHC_PACKAGE_PATHで指定されたパッケージDB内で利用可能になります。よりグローバルな共有を望んでいるように思えますが、ダイナミックプラグインを動作させるには、依存バージョンを整列させる必要があるので、単一のスタックプロジェクト内で実行する必要があります。 いいえ、この。あなたが特定のパッケージidを指定する必要があるので、新しいビルドのものが実際にこれをかなり厄介なものにするのは間違いありません。 – mgsloan

+0

ありがとう!私が理解していることを確認したいと思います。本当に必要なのは、新しいカスタムプラグインをスタックプロジェクトの説明に追加した後、この「外部」実行可能ファイルを再構築することです。そうですか?言い換えれば、1つのスタックプロジェクトを使用して実行可能ファイルをビルドしようとすると、異なるスタックプロジェクトを使用するプラグインは、本質的に欠陥のあるアプローチです。それが正しいのであれば、潜在的なプラグイン開発者にとっては非常に脆弱で制限的なようです。私はこれが、(実行可能ファイル用の)よく設計された/文書化されたAPIが防ぐことを意図したものだと考えました。私は何か根本的なものを欠いているはずです。 – dbanas

関連する問題