jscpd に無視してもらいたい


はじめに

jscpd は素晴らしいツールです

あらゆる言語で書かれたコードから重複を見つけ出して指摘してくれます

コピー&ペーストであちこちに重複ができてしまうと、無駄にコード量が増えるだけでなく、メンテナンス時にもあちこちを修正せねばならず、変更漏れがあればバグが発生してしまいます

重複はバグの温床、取り除かねばならないのです

以前の記事でも書きましたが、私は GitHub Actions の Super-Linter でいつもお世話になっています

jscpd に指摘されて、処理を共通化することもよくあります(つまり未熟)

しかし、それでも、どうしても見逃して貰いたいときもあるのです

どうしても無視してほしい

ある仕組みの中で、設定情報を json ファイルに持っています

個別のものに対して、同一項目同一値の行が続き、 jscpd に怒られました

例えばこんな感じだと

{
  "aaa": {
    "vvv": "VVV",
    "www": "WWW",
    "xxx": "XXX",
    "yyy": "YYY",
    "zzz": "ZZZ"
  },
  "bbb": {
    "vvv": "VVV",
    "www": "WWW",
    "xxx": "XXX",
    "yyy": "YYY",
    "zzz": "ZZZ"
  }
}

jscpd がこんな風に指摘してきます

Clone found (json):
 - /hello.json [9:7 - 15:3] (7 lines, 97 tokens)
   /hello.json [2:7 - 8:3]

  9 | 2 | ": {
 10 | 3 |     "vvv": "VVV",
 11 | 4 |     "www": "WWW",
 12 | 5 |     "xxx": "XXX",
 13 | 6 |     "yyy": "YYY",
 14 | 7 |     "zzz": "ZZZ"
 15 | 8 |   }

しかし、同じ値ではあるものの、別のものなので共通化せずに別のままにしておきたいのです

コメントで無視する箇所を指定する方法もあります

/* jscpd:ignore-start */
import lodash from 'lodash';
import React from 'react';
import {User} from './models';
import {UserService} from './services';
/* jscpd:ignore-end */

しかし、 json にはコメントを入れることができません

jscpd の設定ファイル

というわけで、設定ファイルで無視対象を指定することにしました

GitHub Actions で動かしている場合、 .github/linters/.jscpd.json に以下のように記載します

{
  "threshold": 0,
  "reporters": [
    "consoleFull"
  ],
  "ignore": [
    "**/*.json"
  ],
  "absolute": true
}

これで json については jscpd の対象外にすることができました

最後に

Super-Linter は様々な linter を動かしてくれます

基本的には設定ファイルを指定できるようになっているので、各 linter の公式を参照して設定方法を確認しましょう