JavaScript
nodejs

JSONファイルを書き換える

JSONファイルを書き換える

nodeは手軽に使えるので、今までシェルスクリプトでやってたようなツール系の処理を書くのに便利なのですが、意外と同じような処理を調べ直すことが多かったので、自分のメモ用に書いておきます。

jsonファイルを書き換えるサンプル

jsonファイルとして、config.default.jsonファイルが

{
  "debug" : true
}

みたなものがあったとして、これをfalseに書き換えて、config.jsonとして保存するコードは
次のようになる。

var fs = require('fs');
var path = require('path');

var config = JSON.parse( 
  fs.readFileSync( 
    path.resolve( __dirname , "config.default.json" ) 
  ) 
);

var env = process.argv[2];

if (env == "release") {
  config.debug = false;
} else {
  config.debug = true;
}

fs.writeFileSync(
  path.resolve( __dirname , "config.json" ),
  JSON.stringify(config,null,'  '), 
  "utf-8"
);

このコードをdeploy_config.jsとすると、呼び出し方は

node deploy_config.js release

debugの値をtrueのままdeployしたい場合は

node deploy_config.js debug

とすればOK

JSON.stringifyと、readFileSync/writeFileSyncの使い方を毎回調べてるので、まとめました。

ファイルのタイムスタンプを比較してコピー

ついでに、ファイルのタイムスタンプを調べて、新しければコピーするコード。
ただし、プレースフォルダで書き換えも行う

今、srcDirとdestDirがあるとして、srcDir内のテキストファイルで新しいものがあれば、destDirにコピーする

また、プレースフォルダで、テキスト内に%%%ADMIN_MAIL%%%###DEBUG_MODE%%%があれば、それぞれadmin_mail、config.debugに変換する。

fs.readdirSync(srcDir).forEach( file => {
  var srcFile = path.join(srcDir,file);
  var destFile = path.join(destDir,file);

  var srcStat = fs.statSync(srcFile);
  var srcMtime = srcStat.mtime;

  var destStat = fs.statSync(destFile);
  var destMtime = destStat.mtime;

  if (srcMtime.getTime() > destMtime.getTime()) {

    var text = fs.readFileSync(srcFile,'utf-8');

    text = text.replace('%%%ADMIN_MAIL%%%',admin_mail);
    text = text.replace('%%%DEBUG_MODE%%%',config.debug);

    fs.writeFileSync(destFile,text,'utf-8');

    console.log( "copy " + srcFile + " => " + destFile );
  } else {
    console.log( "skip " + srcFile + " => " + destFile );
  }
});

fs.statSyncで取得した更新日時(mtime)は、Dateオブジェクトなので、getTime()で
UNIXタイムスタンプを取得出来るので、それを比較している。