Haskell CLIプロジェクトで複数コマンドを生成する方法
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セクションを修正
- main セクションを修正
- source-dirs を削除
- 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 ()
= do
main
someFuncputStrLn "Foo!"
barコマンドのコード作成
module Main where
import Lib
main :: IO ()
= do
main
someFuncputStrLn "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