環境変数を変更して実行したいときってあるじゃないですか。
たとえば、x64とx86を使い分けたいときとか。x64用にアプリケーションをビルドしたり、その逆だとか。。
正直なところ、nodeとかまだほとんどわからないけどどうしてもそうゆうのが必要なときがあったので、一応メモ。
前提
- nodistが入ってること
- windows
正直なところ、windowsはメインマシンじゃなくて全然詳しくないので32bitアーキテクチャで64bitのnodeがインストールできるのかとか、どうなのかは詳しくわからないです。
windowsにおけるnodeのバージョン管理ツールもnodist以外に知らないという…。勉強中です!
今何モードでnodeが動いているか確認する
% node
> process.env
環境がwindowsだったらNODIST_X64
という項目があるはず。
NODIST_X64=1
だったら64bitだし、NODIST_X64=0
だったら32bitモードで動いている。
cmd上で意図的に切り替えるには
- cmdにて
set NODIST_X64=0
またはset NODIST_X64=1
% set NODIST_X64=0
% node
> process.env
...
- このとき32bitのnodeがインストールされていないと
node
で対話モードが開けないので注意。 -
set NODIST_X64=0
した後にnodist dist
でインストール可能なバージョンを確認してnodist v0.0.0
ソース上で取得するには
-
忘れてしまった。たしかprocess.archだった気がする。- Process - process.arch
- process.archであってた。
- 使用例(上記リンク先より引用)
console.log(`This processor architecture is ${process.arch}`);
【本題】child_processで環境変数を使い分けるには
execもspawnも同じだけど、オプションのenvをセットするのだ。
child_process.exec
- execは引数にコマンド(String)、オプション(Object)、コールバック関数をとる
- 公式ドキュメント:child_process.exec
- このoptionというところにenvをセットする必要がある
具体的にはこんな感じ
exec('dir', {cwd:'./', env:{NODIST_X64:0}});
ただ私の環境ではNODIST_PREFIX
をセットしろと怒られたので、それもセットしときました。
exec('dir', {cwd :'コマンドを実行したいディレクトリのパス', env:{NODIST_X64:0, NODIST_PREFIX:'Cドラのプログラムファイル(x86)下のnodistディレクトリ'}})
↑申し訳ないことに詳細なパスを忘れてしまった。。
ただしnodistを無事インストールできていてパスが通っていてnodeが動くならprocess.envから確認ができたはず。
なので、どこにあるかよくわからない人は一旦cmd.exeより
% node
> process.env
にてNODIST_PREFIXを確認しておくとよい。
なお、cwdをセットすることで1つのスクリプトからあるプロジェクトのビルドをしたり、などができる(便利だしその話は別途書き留めておきたい)
child_process.spawn
- spawnは引数にコマンド(String)、引数(String[])、オプション(オブジェクト)をとる
- 公式ドキュメント:child_process.spawn
- execと同じく、optionというところにenvをセットする必要がある
spawn('dir', ['/b'], {cwd :'コマンドを実行したいディレクトリのパス', env:{NODIST_X64:0, NODIST_PREFIX:'Cドラのプログラムファイル(x86)下のnodistディレクトリ'}});
それにしても、現在大絶賛学習中のchild_processについてもまたいずれきちんとまとめておきたいところです。なお、javascriptの文法がわかりません。あとpromiseってなんなんでしょう。。。非同期処理って…。
以上。