LoginSignup
0
0

Moon: タスクでglobパターンが展開されてしまうのを防ぐ方法

Posted at

はじめに

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.shellfalseに設定します。

tasks:
  hello:
    command: echo 'hello *'
    options:
      shell: false

これにより、意図せずglobが展開されることはなくなります。

様々な実験

この解決策に至るまで、いくつかの実験を行ったので、そのコードを共有します。

moon.yml
$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.shellfalseに設定することで回避できます。
様々なパターンを試してみましたが、この方法が一番スッキリと解決できました。
moonを使う際は、このような落とし穴にも気をつけながら、快適なタスク管理を行っていきましょう。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0