はじめに
moonrepoのタスクはコマンドを実行するための便利な仕組みです。シンプルな例だと次のように書けます。
tasks:
hello:
command: echo Hello World
しかし、command
にglobパターンを使用すると、意図せずmoonによって展開されてしまうという落とし穴があります。
例えば、moon.yamlにて、echo hello *
というコマンドをcommandに書いて実行すると、
hello moon.yaml
のような出力が得られてしまいます。これは、*
がmoonによって解釈され、コマンドを実行したディレクトリにあるmoon.yaml
ファイルのファイル名に変換されてしまうためです。ちなみにこの現象はmoon 1.24.4で確認しました。
Globの展開を防ぐ方法
この問題を防ぐには、tasks.*.options.shell
をfalse
に設定します。
tasks:
hello:
command: echo 'hello *'
options:
shell: false
これにより、意図せずglobが展開されることはなくなります。
様々な実験
この解決策に至るまで、いくつかの実験を行ったので、そのコードを共有します。
$schema: https://moonrepo.dev/schemas/project.json
tasks:
demos:
deps:
- demo1
- demo2
- demo3
- demo4
- demo5
- demo6
- demo7
demo1:
command: echo 'hello *'
inputs: []
options:
cache: false
demo2:
command: echo "hello *"
inputs: []
options:
cache: false
demo3:
command: echo "hello **/*"
inputs: []
options:
cache: false
demo4:
command: echo hello *
inputs: []
options:
cache: false
demo5:
command:
- echo
- hello
- "*"
demo6:
command: echo
args:
- hello
- "*"
demo7:
command: echo 'hello *'
options:
shell: false
ディレクトリ構成は以下の通りです。
.
├── dir1
│ └── dir2
│ └── dir3
│ └── file
└── moon.yml
実行結果は次のようになります。
❯ moon run -c 1 :demos
▪▪▪▪ demo:demo1
▪▪▪▪ demo:demo1 (34ms)
::: zshenv :::
hello dir1 moon.yml
▪▪▪▪ demo:demo2
▪▪▪▪ demo:demo2 (33ms)
::: zshenv :::
hello dir1 moon.yml
▪▪▪▪ demo:demo3
▪▪▪▪ demo:demo3 (34ms)
::: zshenv :::
hello dir1 dir1/dir2 dir1/dir2/dir3 dir1/dir2/dir3/file moon.yml
▪▪▪▪ demo:demo4
▪▪▪▪ demo:demo4 (34ms)
::: zshenv :::
hello dir1 moon.yml
▪▪▪▪ demo:demo5 (cached from previous run, 1a74b9e1)
::: zshenv :::
hello dir1 moon.yml
▪▪▪▪ demo:demo6 (cached from previous run, 011b7238)
::: zshenv :::
hello dir1 moon.yml
▪▪▪▪ demo:demo7 (cached from previous run, 6f4e067f)
hello *
▪▪▪▪ demo:demos (cached from previous run, f5fc3c10)
Tasks: 8 completed (4 cached)
Time: 160ms
demo7のshell: false
以外はことごとくglobが展開されてしまっているのが分かります。
まとめ
moonrepoのタスクでglobパターンが意図せず展開されてしまう問題は、tasks.*.options.shell
をfalse
に設定することで回避できます。
様々なパターンを試してみましたが、この方法が一番スッキリと解決できました。
moonを使う際は、このような落とし穴にも気をつけながら、快適なタスク管理を行っていきましょう。