node.jsでファイルにCopyrightコメントを1行目に追加する方法

Copyrightコメントを1行目に追加

JavaScriptコードを書く際に(c) iwb.jpのようなCopyrightコメントを1行目に追加したいことがある。

しかし、ファイルが複数ある場合やすでにCopyrightコメントがある場合は手作業で追記していくのは大変な作業になってしまう。

そこでnodeの引数に指定したファイル名に自動的にCopyrightコメントを追記するnode.js用のスクリプトファイルを自作した。もちろんすでにCopyrightコメントがある場合は重複を避けるため追記しないようにしてある。

シェルスクリプト版も作成してあるので用途によってはこちらを使用したほうが良いだろう。

shの引数に指定したファイル名に自動的にCopyrightコメントを追記するシェルスクリプトファイルを自作した

Copyrightコメント追記コードの作成方法

まずモジュールは「fs」と「firstline」を使用する。fsはインストール不要だが、firstlineはインストールしないと使えないのであらかじめインストールしておこう。

npm install firstline

インストールしたらrequireで読み込んで下記のようなJavaScriptコードを作成する。

const fs = require('fs')
const firstline = require('firstline')
const copyright = '// (c) iwb.jp'
const jsFiles = []
for (let i = 2; i < process.argv.length; i++) {
  jsFiles.push(process.argv[i])
}

jsFiles.forEach(file => {
  const firstlineTxt = firstline(file)
  firstlineTxt.then(v => {
    if (v !== copyright) {
      const data = fs.readFileSync(file)
      const fd = fs.openSync(file, 'w+')
      const insert = new Buffer(copyright + '\n')
      fs.writeSync(fd, insert, 0, insert.length, 0)
      fs.writeSync(fd, data, 0, data.length, insert.length)
      fs.close(fd, err => {
        if (err) throw err;
        console.log('追記完了:' + file)
      })
    } else {
      console.log('追記済み:' + file)
    }
  })
})

あとはcopyright.jsのような適当な名前を付けて下記のように実行すればCopyrightコメントを1行目に追記することができる。

node copyright.js foo.js bar.js
// (c) iwb.jp
function add(a, b) {
  return a + b
}
add(1, 2)

もしもCopyrightコメントを追記するファイルの一覧が決まっている場合はfiles.txtに一覧を記載してfs.createReadStreamやreadlineを利用して読み込むと便利だ。

const readline = require('readline')
const stream = fs.createReadStream('./files.txt', 'utf8')
const reader = readline.createInterface({ input: stream })

応用すれば特定のフォルダ内のファイルやGitのaddで追加したファイルだけにコメントを追記することもできるようになる。