Haskell CLIプロジェクトで複数コマンドを生成する方法

Tech > Haskell

1つのstackプロジェクトで複数のコマンドfooコマンドやbarコマンドを作成する方法、最終的な利用方法は以下の通り

~/multicom $ stack build
~/multicom $ stack exec -- foo
~/multicom $ stack exec -- bar

プロジェクトの作成

コマンドラインプロジェクトを作成する

~/ $ stack new multicom

templateを省略した場合、 new-template が指定されるようです、作成されたプロジェクトは以下のディレクトリ構成になります

  • 新規作成プロジェクト
├── ChangeLog.md
├── LICENSE
├── README.md
├── Setup.hs
├── app
│  └── Main.hs
├── multicom.cabal
├── package.yaml
├── src
│  └── Lib.hs
├── stack.yaml
└── test
    └── Spec.hs

複数コマンド用に修正する

package.yaml をコマンドが複数作成されるように修正する

executablesセクションを修正

  1. main セクションを修正
  2. source-dirs を削除
  3. appディレクトリ 下のファイル名もリネームまたは作成して変更する
executables:
  foo:
    main:                app/Foo.hs
    ghc-options:
    - -threaded
    - -rtsopts
    - -with-rtsopts=-N
    dependencies:
    - multicom
  bar:
    main:                app/Bar.hs
    ghc-options:
    - -threaded
    - -rtsopts
    - -with-rtsopts=-N
    dependencies:
    - multicom

実行コマンドのコード修正

fooコマンドのコード作成

module Main where

import Lib

main :: IO ()
main = do
  someFunc
  putStrLn "Foo!"

barコマンドのコード作成

module Main where

import Lib

main :: IO ()
main = do
  someFunc
  putStrLn "Boo!"

最終的に修正したプロジェクトの構成は以下の通り

  • 複数コマンド版プロジェクト構成
├── ChangeLog.md
├── LICENSE
├── README.md
├── Setup.hs
├── app
│  ├── Bar.hs
│  └── Foo.hs
├── multicom.cabal
├── package.yaml
├── src
│  └── Lib.hs
├── stack.yaml
├── stack.yaml.lock
└── test
    └── Spec.hs

ビルド

2つのコマンドをビルドする

~/Code/multicom $ stack build
Building all executables for `multicom' once. After a successful build of all of them, only specified executables will be rebuilt.
multicom> configure (lib + exe)
Configuring multicom-0.1.0.0...
multicom> build (lib + exe)
Preprocessing library for multicom-0.1.0.0..
Building library for multicom-0.1.0.0..
Preprocessing executable 'bar' for multicom-0.1.0.0..
Building executable 'bar' for multicom-0.1.0.0..
[2 of 2] Compiling Main
Linking .stack-work/dist/x86_64-linux-tinfo6/Cabal-3.2.1.0/build/bar/bar ...
Preprocessing executable 'foo' for multicom-0.1.0.0..
Building executable 'foo' for multicom-0.1.0.0..
[1 of 2] Compiling Main
[2 of 2] Compiling Paths_multicom
Linking .stack-work/dist/x86_64-linux-tinfo6/Cabal-3.2.1.0/build/foo/foo ...
multicom> copy/register
Installing library in /home/cuomo/Code/multicom/.stack-work/install/x86_64-linux-tinfo6/2336e1058c3e0c120d9022f785c984d54204bfffd7e549c9ae8b496c115d82f5/8.10.7/lib/x86_64-linux-ghc-8.10.7/multicom-0.1.0.0-68mB6jzluQzDD8Hew3OEtb
Installing executable bar in /home/cuomo/Code/multicom/.stack-work/install/x86_64-linux-tinfo6/2336e1058c3e0c120d9022f785c984d54204bfffd7e549c9ae8b496c115d82f5/8.10.7/bin
Installing executable foo in /home/cuomo/Code/multicom/.stack-work/install/x86_64-linux-tinfo6/2336e1058c3e0c120d9022f785c984d54204bfffd7e549c9ae8b496c115d82f5/8.10.7/bin
Registering library for multicom-0.1.0.0..
~/Code/multicom $

実行

~/Code/multicom $ stack exec -- foo
someFunc
Foo!
~/Code/multicom $
~/Code/multicom $ stack exec -- bar
someFunc
Bar!

インストール

~/Code/multicom $ stack install
Copying from /home/cuomo/Code/multicom/.stack-work/install/x86_64-linux-tinfo6/2336e1058c3e0c120d9022f785c984d54204bfffd7e549c9ae8b496c115d82f5/8.10.7/bin/bar to /home/cuomo/.local/bin/bar
Copying from /home/cuomo/Code/multicom/.stack-work/install/x86_64-linux-tinfo6/2336e1058c3e0c120d9022f785c984d54204bfffd7e549c9ae8b496c115d82f5/8.10.7/bin/foo to /home/cuomo/.local/bin/foo

Copied executables to /home/cuomo/.local/bin:
- bar
- foo
~/Code/multicom $ 

コード

githubです、置いておきました

https://github.com/calimakvo/multicom

Posted on 2021-12-10 07:43:09

はじめまして

お茶の国静岡で、焼酎のお茶割なんか罰当たりで飲んだことはありません、常に一番搾りを嗜む静岡極東のBBQerです、最近まわりのエンジニアの方々がお料理を上手にやっている姿を恨めしそうに横目に見ながら、軟骨ピリ辛チクワを食べています、みなさんよろしく。

Posted

Amazon

tags

家系 日本酒池 広井酒店 やがら やっぱた 刺身 丸干し 鯵 東京マラソン fpm php82 servant thread spawn Rust Oracle Linux 8 microcode firmware linux openzfs zfs gitea 麒麟 真野鶴 金鶴 日本酒 docker oracle pod podman cli virtualbox VirtualBox epub mobi calibre mask lens ワンライナー php 海 redmine Linux Oracle Map OMap omap map 夏 BBQ カテゴリ管理 カテゴリ timestamp date oracle database string 麦焼酎 ダービー process 磨き蒸留 広井酒店、日本酒 芋焼酎 酒 焼酎 ゆるキャン 広井酒店、日本酒池 spring framework java persistent spring session session spring hdbc-odbc persistent-odbc odbc day utctime スィート レマンの森 elm初期化 elm バイク xlr80 esqueleto database xl2tpd strongswan vpn l2tp ipsec 正月 ゲーム grub nginx systemctl portage 豚骨 圧力鍋 yesod-auth-hashdb yesod-auth