cabalまたはghcをインストールせずにhaskell実行可能ファイル(cabalプロジェクト)を実行する方法

Dec 01 2020

私はcabalを使ってhaskellでアプリケーションを構築しました。コマンドプロンプト「cabalrun [cabalfile]」に入力して実行可能ファイルを実行できます。今、私はこのアプリケーションを友達と共有したいと思っています。できれば、友達のマシンにcabalをインストールする必要はありません。プロジェクトの.exeファイルはビルドディレクトリにありますが、プログラムに付属の.txtファイルが読み込まれません。.exeファイルは、実行時にターミナルを開きますが、cabalを使用して実行した場合は開きません(そうする必要があります)。これは、不足しているものがあるため、.exeを単独で共有できないことを示しています。cabalまたはghcをインストールせずにアプリケーションを実行するためのソリューションは何ですか?

回答

3 JonPurdy Dec 01 2020 at 03:34

ここにいくつかの可能な解決策があります。

デフォルトでは、相対パスを使用してプログラムからファイルを開くと、プログラムの現在の作業ディレクトリからの相対パスになります。このディレクトリは、実行可能ファイルが存在する場所ではなく、実行可能ファイルが実行された場所です。実行可能パスまたはインストールディレクトリに関連するファイルを検索する場合は、明示的に検索する必要があります。これを行うには、2つの基本的な方法があります。手動で使用System.Environment.getExecutablePathしてプログラムディレクトリを取得し、それをファイルへのパスと組み合わせます。

import System.Environment (getExecutablePath)
import System.FilePath ((</>))

installRelative :: FilePath -> IO FilePath
installRelative relative = do
  absolute <- getExecutablePath
  pure (absolute </> relative)

readInstalledFile :: FilePath -> IO String
readInstalledFile path = readFile =<< installRelative path

data-filesCabalファイルのフィールドを使用して、ファイルをプロジェクトに追加することもできます。これにより、上記で定義したアクションと同じ機能を実行するようないくつかの関数をエクスポートするモジュールが生成されます。次に、を使用してプロジェクトをインストールすると、データファイルがインストールディレクトリにコピーされ、プログラムは実行時にそれらを見つけることができます。ただし、これはCabalを使用したプログラムのインストールに依存します。これは、インストールディレクトリがベイクされた絶対パスを生成するためです。Paths_projectNamegetDataFileName :: FilePath -> IO FilePathinstallRelativecabal install

cabal install「プログラムファイル」ディレクトリなど、マシンの標準的な場所にプログラムをインストールするために使用する場合、パスがハードコードされているかどうかは関係ありません。実行可能ファイルとサポートファイルをアーカイブにコピーするだけで、ユーザーにプログラムファイルディレクトリで解凍してもらいます。

ZIPアーカイブの代わりに、代わりにWindowsインストーラーをビルドできます。または、file-embedパッケージを使用してファイルを実行可能ファイルに直接埋め込むことにより、実行時に何かをロードする必要をなくすことができます。

ターミナルが開かないようにする方法については、具体的にはあなたの質問に対する私の答えを参照してください。