LoginSignup
2
0

More than 1 year has passed since last update.

Googleさんの zx をローカルインストールして「nodeコマンドで実行」/「ファイルを直接指定して実行」

Last updated at Posted at 2022-01-13

この記事の内容は、昨年末のアドベントカレンダー用の記事でも扱った、Googleさんの zx に関するものです。

●【Backlog 2021】 Googleさんの zx で Backlog API を扱う(JavaScript で課題を追加する) - Qiita
 https://qiita.com/youtoy/items/36ea84e09332d4e6815a

何をやるか

今回の記事で扱う内容は、以下のとおりです。

  • npm i zx で zx をローカルにインストールして使う
  • node ●●.mjs というような nodeコマンドを使った処理の実行
  • ./●●.mjs というようなファイルを直接実行する形での処理

下準備

冒頭の記事でも書いている、今回のセットアップの話をざっくり書きます。
なお、自分が試している環境は Mac で、Node.js のバージョンは 14.18.2 です。

Node.js のバージョンについては、公式ページに以下の指定がありますので、その点だけご注意ください。
バージョン指定.jpg

zx をローカルインストール

まずは以下のコマンドを任意の場所で実行します。

$ npm i zx

これで、コマンドを実行したフォルダに node_modulesフォルダがや package.json などができると思います。

テスト用のプログラムを用意して zx コマンドで実行する

次に、上記の手順で npmコマンドを実行したフォルダに、JavaScript のプログラムのファイルを作ります。
ファイル名は適当に test.mjs にしました。

拡張子を mjs にしているのは、zx の公式ページの以下にも書いてある「top-level await」をシンプルに使うためです。
mjsを使う話.jpg
test.js という名前にした場合、上記のとおり全体を async function でラップしてやる必要が出てきます。

テスト用のプログラム

ここで、シンプルなプログラムを用意してみます(補足は、プログラムの内容と実行結果の後に書きます)。
以下の処理内容は「lsコマンド」・「1秒間のスリープ」・「chalk を使った色付きの文字出力」を順番に実行するという適当なものにしました。

test.mjs
await $`ls`
await sleep(1000);
console.log(chalk.blue("Hello world!"));

プログラムを zxコマンドで実行する

まずは、zxコマンドで実行します。
グローバルインストールではなくローカルインストールを行ったために、直接 zxコマンドが使えません。それに関する対処として npxコマンドを使い zxコマンドを実行します。

$ npx zx test.mjs

実行結果は以下の通りで、想定どおりの結果になりました。
(1行目の右端のあたりが実行コマンドで、2行目移行が実行結果の出力です)
テスト実行.jpg

プログラムの補足

1行目は、公式ドキュメントの以下に書いてある方法で lsコマンドを実行しています。書き方は「$`【コマンド】`」という形です。
コマンド実行.jpg

2行目は、公式ドキュメントの以下に書いてある関数を利用しています。
スリープ関数.jpg
これは公式ドキュメントの「Functions」という項目で書かれた内容のうちの 1つです。
他にも、cd()fetch()question()nothrow()などが、Functions という項目の部分に書かれています。

3行目は、公式ドキュメントの以下に書いてある関数を利用したものです。
chalkパッケージ.jpg
chalkパッケージをインポートすることなく利用できる状態にしているようです。

テスト用のプログラムを少し書きかえて nodeコマンドで実行する

次に、上で用いていたプログラムを少し書きかえて、nodeコマンドで実行できるようにしてみます。
ちなみに、上記のプログラムをそのまま実行すると $ is not defined というエラーになります。

それを避けるために、以下に書かれた対応(import 'zx/globals'という行を冒頭に追加)をします。
実行方法.jpg
その対応を行った後のプログラムは、以下のようになります。

test.mjs
import 'zx/globals'

await $`ls`
await sleep(1000);
console.log(chalk.blue("Hello world!"));

再度、nodeコマンドで実行してみると、今度は無事に処理が完了しました。
nodeコマンドで実行.jpg

プログラムをまた少し書きかえてからファイルを直接指定する形で実行

今度は、ファイルを直接指定して実行できる形にして、プログラムを実行してみます。
この後のプログラムのファイル名は、上記と区別するために「test2.mjs」に変えました(前のままでも問題はないのですが...)。

ファイルを直接指定して実行できるようにするため、mjsファイルに実行権限を付与します。

chmod +x test2.mjs

この後、 ./test2.mjs という形で、ファイルを直接指定して実行することができますが、今は実行後にエラーが発生します。
そこで、以下の記事などにも書かれている「shebang(hashbang)」を、プログラムの冒頭に追加します。

●JavaScriptと #!
 https://zenn.dev/qnighy/articles/d2712de8e4585f749b30

これで、test2.mjs を何を使って実行するか(つまり、nodeコマンドで実行すること)を指定できます。

test2.mjs
#!/usr/bin/env node
import 'zx/globals'

await $`ls`
await sleep(1000);
console.log(chalk.blue("Hello world!"));

再度、ファイルを直接指定して実行してみると、無事に動作させることができました。
ファイルを直接指定して実行.jpg

グローバルインストールして使う場合の話

今回の記事では、zx をローカルインストールして利用しました。
グローバルインストールをして使う場合は、公式ページや以下のページなどをご参照ください。

●Google発のJavaScriptで書けるシェル 「zx」 | DevelopersIO
 https://dev.classmethod.jp/articles/shell-zx/

●zxを使ってみた│FORCIA CUBE│フォルシア株式会社
 https://www.forcia.com/blog/002378.html

2
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
2
0