Tslint: ์ œ์•ˆ: ์กฐ๊ฑด๋ถ€ ๋ฆฐํŠธ ๊ตฌ์„ฑ

์— ๋งŒ๋“  2017๋…„ 11์›” 03์ผ  ยท  42์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: palantir/tslint

๋ฆฐํŠธ๋˜๋Š” ์ฝ”๋“œ๊ฐ€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์ธ์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋ฆฐํŠธ ๊ฒ€์‚ฌ๋ฅผ ์กฐ๊ฑด๋ถ€๋กœ ์‹œํ–‰ํ•˜๋ ค๋Š” ์ƒํ™ฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์•ˆ์ „ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ์—์„œ 'any'๋ฅผ ๊ธˆ์ง€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ…Œ์ŠคํŠธ์—์„œ 'any'๋Š” ์„œ๋น„์Šค์˜ ๊ฐ€์งœ ๋˜๋Š” ๋ชจ์˜ ๊ตฌํ˜„์„ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜ ๊ฐœ์ธ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋„๋ก ์ด๋ฅผ ํ†ตํ•ด ์บ์ŠคํŒ…ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด ํ…Œ์ŠคํŠธ์™€ ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ์—์„œ ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ ์ง‘ํ•ฉ์„ ๊ธˆ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์€ ํŒŒ์ผ ์ด๋ฆ„์— ๋Œ€ํ•œ ์ •๊ทœ์‹ ์ผ์น˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฆฐํŠธ ๊ฒ€์‚ฌ๋ฅผ ์กฐ๊ฑด๋ถ€๋กœ ํ™œ์„ฑํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด๋Š” ํŠน์ • ๋””๋ ‰ํ† ๋ฆฌ(์˜ˆ: "๋ ˆ๊ฑฐ์‹œ" ์ฝ”๋“œ ํฌํ•จ) ๋˜๋Š” .tsx ๋˜๋Š” .d.ts ํŒŒ์ผ ๋“ฑ์— ๋Œ€ํ•œ ๋ฆฐํŠธ ๊ฒ€์‚ฌ๋ฅผ ๋„๋Š” ๋ฐ์—๋„ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ๋ช‡ ๊ฐ€์ง€ ๊ตฌ๋ฌธ ์ŠคํŠธ๋กœ์šฐ๋งจ ์•„์ด๋””์–ด์ž…๋‹ˆ๋‹ค. ๋‚˜๋„ ์ œ์•ˆ์— ์—ด๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.

์„น์…˜ ๊ฐœ์ฒด

{
  "rules": {
    "no-any": {"other": true},
    "no-console":
        {
          "test": [true, "warn", "error"], 
          "other": [true, "log", "warn", "error"]
        }
  },
  "sections": {
    "test": ".*\\.spec\\.ts$"
  }
}

"๊ธฐํƒ€"๋Š” ์ •๊ทœ์‹๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋งค์šฐ ๊ฐ„๊ฒฐํ•˜์ง€๋งŒ ๊ทœ์น™ ์„น์…˜์˜ ๊ฐ€๋…์„ฑ์ด ์•ฝ๊ฐ„ ๋–จ์–ด์ง„๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

"์žฌ์ •์˜" ๊ทœ์น™

{
  "rules": {
    "no-any": true,
    "no-console": [true, "log", "warn", "error"]
  },
  "override": {
    "match": ".*\\.spec\\.ts$",
    "rules": {
      "no-any": false,
      "no-console": [true, "warn", "error"]
    }
  }
}

(์—ฌ๋Ÿฌ ๋ฒˆ ์žฌ์ •์˜๋„ ํ—ˆ์šฉํ•˜๋ ค๋ฉด ๋ฐฐ์—ด์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.)

Declined Enhancement

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ค‘์ฒฉ์€ ์—ฌ๊ธฐ์„œ ๋…ผ์˜๋œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋งŽ์€ ์‚ฌ๋žŒ๋“ค ์ด ํ…Œ์ŠคํŠธํ•˜๋Š” ์ฝ”๋“œ์™€ ๋™์ผํ•œ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋ฉฐ ํ˜„์žฌ๋กœ์„œ๋Š” tslint๋กœ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  42 ๋Œ“๊ธ€

ํ…Œ์ŠคํŠธ์™€ ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ ๋””๋ ‰ํ† ๋ฆฌ์— ๋„ฃ์œผ๋ฉด ๊ทธ๋Ÿฌํ•œ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ํŒŒ์ผ์„ CLI ์ธ์ˆ˜๋กœ ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฉด TSLint๋Š” ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด tslint.json ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ํด๋”์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ์„ค์ •์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. "extends" ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋™์ผํ•œ ๊ธฐ๋ณธ ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜๊ณ  ํŠน์ • ๊ทœ์น™๋งŒ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งŽ์€ Angular ๋ฐ React ํ”„๋กœ์ ํŠธ๊ฐ€ ํ•ด๋‹น ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ์™€ ๋™์ผํ•œ ๋””๋ ‰ํ† ๋ฆฌ์— ํ…Œ์ŠคํŠธ๋ฅผ ๋„ฃ๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ์ด๊ฒƒ์€ ๋‚˜์œ ์Šต๊ด€์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด (์‹ค์ˆ˜๋กœ) ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ์˜ ํ…Œ์ŠคํŠธ์—์„œ ๊ธฐํ˜ธ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

IMO ์ œ์•ˆ๋œ ๊ธฐ๋Šฅ์€ ๋ณต์žก์„ฑ์„ ๋งŽ์ด ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๊ตฌํ˜„์€ ๊ทธ๋ฆฌ ์–ด๋ ต์ง€ ์•Š์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์ฝ๊ณ  ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
์šฐ๋ฆฌ๊ฐ€ ์ด๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ๋‘ ๋ฒˆ์งธ ์ œ์•ˆ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ๊ตฌ์„ฑ์„ ํ™•์žฅํ•  ๋•Œ ์ž‘๋™ ๋ฐฉ์‹์— ๋Œ€ํ•ด์„œ๋„ ๋…ผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์žฌ์ •์˜๋Š” ์–ด๋–ค ์ˆœ์„œ๋กœ ์ ์šฉ๋ฉ๋‹ˆ๊นŒ?

์‚ฌ์‹ค, ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ์ธ์ฒด ๊ณตํ•™์— ํ•ด๋ฅผ ๋ผ์นฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ๊ฐ€์ง€๊ณ  ์žˆ๊ฑฐ๋‚˜

src/
  tslint.json
  a/
    b/
      c/
test/
  tslint.json (extends ../src)
  a/
    b/
      c/

c/foo.spec.ts ๋Š” import {symbol} from '../../../a/b/c/foo';

๊ทธ ๊ฒฝ๋กœ๋Š” ํŒŒ์ผ์ด ์ข…์ข… ํŠธ๋ฆฌ์—์„œ ๋งค์šฐ ๊นŠ์ˆ™์ด ์žˆ๋Š” ๋ชจ๋…ธ๋ ˆํฌ์—์„œ ๋ณด๊ธฐ ํ‰ํ•ด์ง‘๋‹ˆ๋‹ค.

๋˜๋Š” ๋‹น์‹ ์ด ๊ฐ€์ง€๊ณ 

  a/
    src/
      tslint.json
    test/
      tslint.json (extends ../src)
    b/
      src/
        tslint.json
      test/
        tslint.json (extends ../src)
      c/
        src/
           tslint.json
        test/
          tslint.json (extends ../src)

๋„ˆ๋ฌด ๋งŽ์€ tslint.json ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

์žฌ์ •์˜ ์ฃผ์ œ: ์žฌ์ •์˜๊ฐ€ ๋™์ผํ•œ ์ˆœ์„œ๋กœ ์ ์šฉ๋œ๋‹ค๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทœ์น™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ๋ชจ๋ฅด๊ณ  ๋ฌธ์„œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์—ˆ์ง€๋งŒ ์ง๊ด€์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

// a.json
{"rules": {"foo": [true, 1]}}

// b.json
{"rules": {"foo": [true, 2]}}

// c.json
{
  "extends": ["a.json", "b.json"],
  "rules": {"foo": [true, 3]}
}

๊ฒฐ๊ณผ์ ์œผ๋กœ ๊ทœ์น™ "foo"๋Š” ์ธ์ˆ˜ 3์„ ๊ฐ–์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ทœ์น™์ด c.json ์— ์—†์œผ๋ฉด "ํ™•์žฅ" ๋ฐฐ์—ด์˜ ์ˆœ์„œ ๋•Œ๋ฌธ์— "foo"๋Š” ๊ฐ’ 2๋ฅผ ๊ฐ€์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์žฌ์ •์˜์˜ ๊ฒฝ์šฐ ๋™์ผํ•œ ์ˆœ์„œ๊ฐ€ ์ ์šฉ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค. 'ํ™•์žฅ' ๊ทœ์น™์ด ๊ณ ๋ ค๋˜๋Š” ์ˆœ์„œ๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ์ œ๊ณต๋œ ์ •๊ทœ์‹๊ณผ ์ผ์น˜ํ•˜๋Š” ๋งˆ์ง€๋ง‰ ์žฌ์ •์˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. ๋‹จ์ผ ํŒŒ์ผ ์˜ˆ:

{
  "rules": {"a": [true, 1]},
  "override": [
    {"match": "test|spec", "rules": {"a": [true, 2]}},
    {"match": "test", "rules": {"a": [true, 3]}}
  ]
}

ํŒŒ์ผ ๊ฒฝ๋กœ์— "spec"์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด ๊ทœ์น™ "foo"์— ๋Œ€ํ•ด ๊ฐ’ 2, "test"๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด 3, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 1์ด ๋ฉ๋‹ˆ๋‹ค. (๋ถ„๋ช…ํžˆ "ํ…Œ์ŠคํŠธ"๊ฐ€ ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ์—์„œ ์ƒ๋žต๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ์œ ์šฉํ•œ ์žฌ์ •์˜ ์„ธํŠธ๋Š” ์•„๋‹ˆ์ง€๋งŒ ์•„์ด๋””์–ด๋Š” ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค)

๊ทธ๊ฒƒ์ด ์˜๋ฏธ๊ฐ€ ์žˆ๊ณ  ๊ท€ํ•˜์˜ ์งˆ๋ฌธ์— ๋Œ€๋‹ตํ•ฉ๋‹ˆ๊นŒ?

@calebegg ๊ณ ๋ คํ•ด์•ผ ํ•  ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ

// a.json
{
  "rules": {"foo": [true, 1]},
  "override": {"match": "test|spec", "rules": {"foo": [true, 2]}}
}

// b.json
{
  "extends": "./a.json"
  "rules": {"foo": false}
}

์˜ˆ์ƒ๋˜๋Š” ๊ฒฐ๊ณผ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

  • 2 ์ฃผ๋ฌธ์ด a.json/rules 2 ์ด๊ธฐ ๋•Œ๋ฌธ์— -> b.json/rules -> a.json/override
  • false ์ฃผ๋ฌธ์ด a.json/rules false ์ด๊ธฐ ๋•Œ๋ฌธ์— -> a.json/override -> b.json/rules

์—ฌ๊ธฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ์˜ˆ์ƒ ๊ฒฐ๊ณผ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

// c.json
{
  "rules": {"foo": [true, 1]},
  "override": {"match": "test|spec", "rules": {"foo": false}}
}

// d.json
{
  "extends": "./a.json"
  "rules": {"foo": {"options": 2}},
  "override": {"match": "test|spec", "rules": {"foo": {"options": 3}}}
}

๊ทธ๋ƒฅ ๋ฌด์ž‘์œ„๋กœ ์ƒ๊ฐ: ํŒจํ„ด์„ ์ˆœ์„œ๋Œ€๋กœ ์ผ์น˜์‹œํ‚ค๊ณ  ์ด์ „ ์ผ์น˜๋ฅผ (๋ถ€๋ถ„์ ์œผ๋กœ) ์žฌ์ •์˜ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

{
  "rules": { // same as "*"
    "rule-one": true,
    "rule-two": true
  },
  "*.js?(x)": { // we could get rid of "jsRules" with this
    "rule-two": false
  },
  "*.{t,j}sx": {
    "jsx-rule": true
  },
  "*.spec.*" {
    "rule-one": false
  }
}

๋ช‡ ๊ฐ€์ง€ ์˜ˆ:

  • foo.ts : ๊ทœ์น™ 1, ๊ทœ์น™ 2
  • foo.tsx : ๊ทœ์น™ 1, ๊ทœ์น™ 2, jsx ๊ทœ์น™
  • foo.js : ์ฒซ ๋ฒˆ์งธ ๊ทœ์น™
  • foo.jsx : ๊ทœ์น™ 1, jsx ๊ทœ์น™
  • foo.spec.tsx : ๋‘ ๋ฒˆ์งธ ๊ทœ์น™, jsx ๊ทœ์น™
  • foo.spec.js : ์—†์Œ

์ด๊ฒƒ์„ config์— ์–ด๋””์— ๋„ฃ์–ด์•ผ ํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. "rules" ์™€ ๊ฐ™์€ ์ˆ˜์ค€์œผ๋กœ ์ž‘์„ฑํ•˜๋ฉด ์“ฐ๊ธฐ๋Š” ์‰ฌ์šฐ๋‚˜ "extends" , "rulesDirectory" , ...

๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” ๊ตฌ์„ฑ์„ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๊ตฌ์„ฑ์—์„œ ๋ชจ๋“  ์žฌ์ •์˜๋ฅผ ์ ์šฉํ•œ ๋‹ค์Œ ํ˜„์žฌ ๊ตฌ์„ฑ์—์„œ ์žฌ์ •์˜๋ฅผ ์ ์šฉํ•˜๋ฉด ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ๋‹ค์†Œ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์ฝ”๋“œ๋ฅผ ๋” ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ตฌ์„ฑ์€ ๊ตฌ๋ฌธ ๋ถ„์„ ์ค‘์— ๋ณ‘ํ•ฉ๋ฉ๋‹ˆ๋‹ค. ์ด ์ œ์•ˆ์œผ๋กœ ์ตœ์ข… ๊ตฌ์„ฑ์€ ํŒŒ์ผ ์ด๋ฆ„์ด ์žˆ์„ ๋•Œ๋งŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”,

์ด ๊ธฐ๋Šฅ์€ ํ›Œ๋ฅญํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. Eslint๊ฐ€ https://eslint.org/docs/user-guide/configuring#configuration -based-on-glob-patterns ๊ธฐ๋Šฅ์„ ์ง€์›ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ˜ผ๋™์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌ๋ฌธ๊ณผ ์˜๋ฏธ๊ฐ€ ๋™์ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@minomikula ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ „์— ESLint ๋ฌธ์„œ๋ฅผ ๊ฒ€์ƒ‰ํ–ˆ์ง€๋งŒ ์ด ์„น์…˜์„ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋“ค์˜ ์ ‘๊ทผ ๋ฐฉ์‹์€ ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. ์š”์•ฝ:

  • "overrides" ์„น์…˜์—๋Š” ์žฌ์ •์˜ ๋ฐฐ์—ด์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์žฌ์ •์˜๋Š” ์—ฌ๋Ÿฌ glob ํŒจํ„ด( "files" )์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘˜ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์ผ์น˜ํ•˜๋ฉด ๊ตฌ์„ฑ์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • glob ํŒจํ„ด์œผ๋กœ ํŒŒ์ผ์„ ์ œ์™ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: "excludedFiles"
  • glob ํŒจํ„ด์€ ์ง€์ •๋œ ๊ตฌ์„ฑ ํŒŒ์ผ์— ์ƒ๋Œ€์ ์ž…๋‹ˆ๋‹ค.
  • glob ํŒจํ„ด์€ ํ•ญ์ƒ ๊ธฐ๋ณธ ์ด๋ฆ„๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ „์ฒด ๊ฒฝ๋กœ์™€ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์žฌ์ •์˜๋Š” ์ˆœ์„œ๋Œ€๋กœ ์ฒ˜๋ฆฌ๋˜์–ด ์ด์ „ ์žฌ์ •์˜๋ฅผ ์žฌ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ตฌ์„ฑ ํŒŒ์ผ์„ ํ™•์žฅํ•  ๋•Œ ํ™•์žฅ ๊ตฌ์„ฑ์„ ๊ณ„์†ํ•˜๊ธฐ ์ „์— ๊ธฐ๋ณธ ๊ตฌ์„ฑ์ด ์™„์ „ํžˆ ํ‰๊ฐ€๋ฉ๋‹ˆ๋‹ค.

    • base.json/๊ทœ์น™

    • base.json/overrides

    • ํ™•์žฅ.json/๊ทœ์น™

    • ํ™•์žฅ.json/overrides

์ด ๋™์ž‘์„ TSLint๋กœ ์ด์‹ํ•  ๋•Œ ๊ณ ๋ คํ•ด์•ผ ํ•  ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์žฌ์ •์˜์—์„œ extends ๋ฐ linterOptions ๋ฅผ ํ™•์‹คํžˆ ๋น„ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋˜ํ•œ rulesDirectory ๋„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์žฌ์ •์˜์—์„œ rules ๋ฐ jsRules ๋ฅผ ํ—ˆ์šฉํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด **/*.js?(x) ์žฌ์ •์˜๋ฅผ ์œ„ํ•ด jsRules ๋ฅผ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

์ƒ๊ฐ์ด๋‚˜ ์˜๊ฒฌ @adidahiya @calebegg @alexeagle @minomikula?

์˜ค, ์™€์šฐ, ์˜ˆ, ๊ทธ ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋‚˜์—๊ฒŒ๋Š” ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋˜ํ•œ ์„ ํ–‰ ๊ธฐ์ˆ ์„ ์ฐพ์•˜์–ด์•ผ ํ–ˆ๋‹ค.

์ด๊ฒƒ์€ ๋ฉ‹์ง„ ์ถ”๊ฐ€ ์‚ฌํ•ญ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค! eslint ์ ‘๊ทผ ๋ฐฉ์‹์€ ํ…Œ์ŠคํŠธ ํŒŒ์ผ์—์„œ ์ผ๋ถ€ ๊ทœ์น™์„ ์กฐ๊ฑด๋ถ€๋กœ ๋น„ํ™œ์„ฑํ™”ํ•  ๋•Œ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.

@calebegg ์‹œ๊ฐ„ ์ด ๋‚˜๋ฉด ๊ณ„์†

๋„ค, ํ™•์‹คํžˆ ์ด ์ผ์„ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. @ajafff ์ผ๋ฐ˜์ ์œผ๋กœ ESLint ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ ์‹œ์ž‘ํ•˜์—ฌ PR์—์„œ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒƒ์— ๋งŒ์กฑํ•˜์‹ญ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์šฐ๋ฆฌ๊ฐ€ ๋จผ์ € ์ด์•ผ๊ธฐํ•ด์•ผ ํ•  ๋””์ž์ธ ์งˆ๋ฌธ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

์žฌ์ •์˜์—์„œ ๊ทœ์น™๊ณผ jsRules๋ฅผ ํ—ˆ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด */ .js?(x) ์žฌ์ •์˜๋ฅผ ์œ„ํ•ด jsRules๋ฅผ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

๋น„์ถ”์ฒœํ•˜๋Š” ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ์˜๋ฏธ๊ฐ€ ์žˆ์ง€๋งŒ ์–ด๋Š ์ชฝ์ด๋“  ๊ทธ๋‹ค์ง€ ๊ฐ•ํ•˜๊ฒŒ ๋Š๋ผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@calebegg ์ €๋Š” ESLint ์ ‘๊ทผ ๋ฐฉ์‹์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋‚ด POC ๋ฆฐํ„ฐ ๋Ÿฐํƒ€์ž„ https://github.com/fimbullinter/wotan/tree/master/packages/wotan#overrides ์—์„œ ๋งค์šฐ ์œ ์‚ฌํ•œ ๊ฐœ๋…์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ TSLint API์™€์˜ ํ†ตํ•ฉ์€ ํ˜„์žฌ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๋Š” ๋™์•ˆ ๋ชจ๋“  ๊ตฌ์„ฑ์„ ๋ณ‘ํ•ฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํŒŒ์ผ ์ด๋ฆ„์ด ์•Œ๋ ค์ง€๊ณ  ๋ชจ๋“  ํŒŒ์ผ์— ๋Œ€ํ•ด ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•  ๋•Œ๊นŒ์ง€ ์—ฐ๊ธฐ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ํ™•์‹คํžˆ API ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

@calebegg @mitchlloyd @ajafff @alexeagle ์™ธ๋ถ€ ๊ตฌ์„ฑ์„ ์žฌ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด tslint.json ํŒŒ์ผ์„ ๋‹จ์ˆœํžˆ ์ค‘์ฒฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ด ๊ธฐ๋Šฅ์˜ ์ด์ ์ด ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ ๊ธฐ๋Šฅ์€ ์˜ค๋Š˜๋‚  ์ด๋ฏธ ์ž‘๋™ํ•˜๋ฉฐ ๋ณต์žกํ•œ API ์ค‘๋‹จ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ด ์š”์ฒญ์„ ๊ฑฐ๋ถ€ํ•˜๋ฉด ๊ธฐ๋ถ„์ด ์ƒํ•˜๊ฒ ์Šต๋‹ˆ๊นŒ?

์ค‘์ฒฉ์€ ์—ฌ๊ธฐ์„œ ๋…ผ์˜๋œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋งŽ์€ ์‚ฌ๋žŒ๋“ค ์ด ํ…Œ์ŠคํŠธํ•˜๋Š” ์ฝ”๋“œ์™€ ๋™์ผํ•œ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋ฉฐ ํ˜„์žฌ๋กœ์„œ๋Š” tslint๋กœ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.

์†Œ์Šค์™€ ๋™์ผํ•œ ๋””๋ ‰ํ† ๋ฆฌ์— ์‚ฌ์–‘ ํŒŒ์ผ์„ ๋„ฃ๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋งŽ์€ ํ™˜๊ฒฝ์—์„œ ๋ชจ๋ฒ” ์‚ฌ๋ก€๊ฐ€ ๋˜์—ˆ์œผ๋ฉฐ Angular CLI๋Š” ์ด์™€ ๊ฐ™์€ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. tslint ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์ค‘์ฒฉํ•˜๋Š” ๊ฒƒ์ด ํ˜„์‹ค์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚ด ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๊ฐ€ Linting ๋„๊ตฌ์— ์˜ํ•ด ๊ฒฐ์ •๋˜์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  Linting ๋„๊ตฌ๋Š” ์ผ๋ฐ˜์ ์ธ ๊ธฐ์กด ํŒจํ„ด์„ ์ง€์›ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ์™€ ์†Œ์Šค ํŒŒ์ผ์„ ํ•จ๊ป˜ ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ์€ ์ผ๋ฐ˜์ ์ธ ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

@giladgray ์š”์ฒญ๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ…Œ์ŠคํŠธ ๋ฐ ํ”„๋กœ๋•์…˜ ํŒŒ์ผ์„ ๋‚˜๋ž€ํžˆ ๋ฐฐ์น˜ํ•˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

some-dir/
  my-component.ts
  my-component.test.ts

my-component.ts ๋ฐ my-component.test.ts ๋Œ€ํ•ด ๋‹ค๋ฅธ ๊ทœ์น™์„ ์›ํ•  ๋•Œ " tslint.json ํŒŒ์ผ ์ค‘์ฒฉ"์€ ์ด ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๊นŒ?

@giladgray ๊ฐ๋„ ๊ฐ€์ด๋“œ๋ผ์ธ์€ ํ…Œ์ŠคํŠธ๋ฅผ ํŒŒ์ผ๊ณผ ํ•จ๊ป˜ ๋ฐฐ์น˜ํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Angular ํ”„๋กœ์ ํŠธ์˜ 99%๊ฐ€ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. tslint๊ฐ€ ๋’ค๋กœ ๋Œ์•„๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด๊ฐ€ ์ž‘์—…ํ•œ ๋ชจ๋“  ๊ฐ๋„ ํ”„๋กœ์ ํŠธ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๋งˆ์ง€๋ง‰ ์˜๊ฒฌ์€ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ณ  ๊ทผ์‹œ์•ˆ์ ์ž…๋‹ˆ๋‹ค. ์ด ๋ฏฟ์„ ์ˆ˜ ์—†์„ ์ •๋„๋กœ ์œ ์šฉํ•œ ์ œ์•ˆ์„ ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์—†๊ฑฐ๋‚˜ ๋ฐ›์•„๋“ค์ด๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด ๊ทธ๋ ‡๊ฒŒ ์ค‘์š”ํ•œ ํ”„๋กœ์ ํŠธ์—์„œ ์šฐ๋ฆฌ๋ฅผ ๋Œ€์‹ ํ•ด ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๊ธฐ์—๋Š” ๋‹น์‹ ์ด ๋„ˆ๋ฌด ๋ณด์ˆ˜์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋กœ ์ธํ•ด Angular ํ”„๋กœ์ ํŠธ ์ž‘์—…์ด ์ˆ˜๋…„ ๋™์•ˆ ์–ด๋ ค์›Œ์กŒ์Šต๋‹ˆ๋‹ค.

@ohjames ์ฃผ์ œ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์ธ์‹ ๊ณต๊ฒฉ์œผ๋กœ ๋ฐฉํ–ฅ์„

์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ์ค‘์ฒฉ ๊ตฌ์กฐ์— ๋งž์ง€ ์•Š๋Š” ํŒŒ์ผ์— ๋Œ€ํ•œ ์žฌ์ •์˜๋ฅผ ์›ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. 6๊ฐœ์›” ์ด์ƒ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ™œ๋™์ด ์—†์—ˆ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ @giladgray ์˜ ์˜๊ฒฌ์€ ์ด ๋ณ€๊ฒฝ์— ์—ฌ์ „ํžˆ ์ƒ๋‹นํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ด€์‹ฌ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ณต๊ฐœ PR(#3708)์— ๋Œ€ํ•œ ๊ทธ์˜ ๋…ผํ‰์— ์˜ํ•ด ๊ตฌ์ฒด์ ์œผ๋กœ ์ž…์ฆ๋ฉ๋‹ˆ๋‹ค.

์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ์ด ๋ถ„๊ธฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ๊ฒ€ํ† ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ฑฐ๋‚˜ ๋” ์ด์ƒ ๊ด€๋ จ์ด ์—†์œผ๋ฉด ๋‹ซ์œผ์‹ญ์‹œ์˜ค. 2์ฃผ ์ด๋‚ด์— ์—ฐ๋ฝ์ด ์—†์œผ๋ฉด ์ด ์ž‘์—…์„ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

@ohjames ๋‚˜๋Š” ๋‹น์‹ ์ด ๋‹น์‹ ์˜ ์˜๊ฒฌ์„ ์žฌ๊ณ ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค - @DanielSchaffer๊ฐ€ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด, ์ธ์‹ ๊ณต๊ฒฉ์€

์ด ์ฃผ์ œ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?
@ajafff ๊ฐ€ ์š”์•ฝ ๋…ผํ‰ ์—์„œ ์ œ์•ˆํ•œ ์•„์ด๋””์–ด๋Š” ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋ณด์ด๋ฉฐ ๋ชจ๋“  ๋‹ค์–‘ํ•œ ์š”๊ตฌ๋ฅผ ์ถฉ์กฑ์‹œํ‚ต๋‹ˆ๋‹ค. eslint์™€ ๋™์ผํ•œ ์˜๋ฏธ ์ฒด๊ณ„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

๊ด€๋ จ๋œ #1063์— ๋Œ€ํ•ด ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ๋‚ด ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ํ˜„์žฌ tslint-microsoft-contrib๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๋ถ€ ๊ทœ์น™์— ๋Œ€ํ•ด Vue ๋‹จ์ผ ํŒŒ์ผ ๊ตฌ์„ฑ ์š”์†Œ์— ํญํƒ„์„ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Vue ๋ฌธ์ œ์ด๊ฑฐ๋‚˜ TSLint ๋ฌธ์ œ์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ•ด๋‹น ํŒ€์€ ํŠน์ • ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ฃผ๋ณ€์„ ๋‘˜๋Ÿฌ๋ณผ ์ˆ˜๋„ ์žˆ๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๊นŒ์ง€ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๊ทœ์น™์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ฉด ๋„ˆ๋ฌด ๋ฒˆ๊ฑฐ๋กญ์ง€ ์•Š์€ ๊ฐ„๋‹จํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๋‹จ์ผ .vue ํŒŒ์ผ์— ๋™์ผํ•œ ๋น„ํ™œ์„ฑํ™” ์ง€์‹œ๋ฌธ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๊ทœ์น™ ์ง€์›์ด ๋ณ€๊ฒฝ๋จ์— ๋”ฐ๋ผ ๋ชจ๋“  ์œ„์น˜์—์„œ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„๊ต๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ .vue ๋ฐ .ts ํŒŒ์ผ๋กœ ๋ถ„ํ• ํ•˜๋Š” ๊ฒƒ๋„ ์ด์น˜์— ๋งž์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งค์šฐ ์–ด์ƒ‰ํ•œ ๊ตฌ์กฐ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด ๊ธฐ๋Šฅ์ด ๋“ค์–ด์˜ค๋Š” ๊ฒƒ์— ์ฐฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ์žฌ์ •์˜๊ฐ€ ๋ชจ๋“  ๊ทœ์น™์„ ์™„์ „ํžˆ ๋น„ํ™œ์„ฑํ™”ํ•˜๋„๋ก ํ—ˆ์šฉํ•˜์—ฌ #73์˜ tslintignore ์š”์ฒญ์„ ๊น”๋”ํ•˜๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๊นŒ?

{
    "files": "./src/test-data/*.ts",
    "reset": true // Resets tslint.json to {}
}

tslint-microsoft-contrib์€ ํ˜„์žฌ ์ผ๋ถ€ ๊ทœ์น™์— ๋Œ€ํ•ด Vue ๋‹จ์ผ ํŒŒ์ผ ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•ด ํญํƒ„์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์˜ค ๐Ÿ˜• @millimoose tslint-microsoft-contrib์— ๋ฌธ์ œ ๋ฅผ

@JoshuaKGoldberg - ๊ฐ€์žฅ ์ ์ ˆํ•ด ๋ณด์ด๋Š” @vuejs/vue-cli์—์„œ ํ•ด๋‹น ๋ฒ„๊ทธ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋ณด๊ณ ์„œ๋ฅผ ์ด๋ฏธ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ("๋ณต์ œ ๋Œ€๊ธฐ ์ค‘"์œผ๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ํฌ๊ฒŒ ์ž˜๋ชป๋œ ๊ฒƒ์€ ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.) ์—ฌ๊ธฐ์—์„œ ์ฐจ์ž„์— ๋Œ€ํ•œ ๋™๊ธฐ๋กœ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ง„ํ™”ํ•˜๋Š” ์ƒํƒœ๊ณ„์—์„œ ์ž๋ž„ ์ˆ˜ ์žˆ๊ณ  ๋˜ ์ƒ๊ธธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋„๊ตฌ๊ฐ€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ๋ฒ„๊ทธ์— ๋Œ€ํ•œ ํ•ดํ‚น์„ ์‹ค์ œ๋กœ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ ์žฅ์• ๋ฌผ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„ ๋งŒํผ ์ถฉ๋ถ„ํžˆ ์œ ์—ฐํ•˜๋‹ค๋Š” ์ฃผ์žฅ์ด ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ๋ฌธ์ œ๋Š” ํ˜„์žฌ '์ œ์•ˆ ํ•„์š”'๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ์ง€๋งŒ https://github.com/palantir/tslint/issues/3447#issuecomment -344020834์— ์ด๋ฏธ ์ œ์•ˆ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@RoystonS @ajafff ์˜ ์ œ์•ˆ์€ ํ•ด๊ฒฐํ•ด์•ผ ํ•  ๋ช‡ ๊ฐ€์ง€ ๋Š์Šจํ•œ ๋์„ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋™์ž‘์„ TSLint๋กœ ์ด์‹ํ•  ๋•Œ ๊ณ ๋ คํ•ด์•ผ ํ•  ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์žฌ์ •์˜์—์„œ extends ๋ฐ linterOptions ๋ฅผ ํ™•์‹คํžˆ ๋น„ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋˜ํ•œ rulesDirectory ๋„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์žฌ์ •์˜์—์„œ rules ๋ฐ jsRules ๋ฅผ ํ—ˆ์šฉํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด **/*.js?(x) ์žฌ์ •์˜๋ฅผ ์œ„ํ•ด jsRules ๋ฅผ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

๋˜ํ•œ ์ง„ํ–‰ํ•˜๊ธฐ ์ „์— ์ด์— ๋Œ€ํ•ด palantirtech ์กฐ์ง์˜ ์‚ฌ๋žŒ๋“ค๋กœ๋ถ€ํ„ฐ ํ•ฉ์˜๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ƒ๋‹นํžˆ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„ ์šฐ์—ฐํžˆ ๋ฐœ๊ฒฌํ–ˆ๊ณ  ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๊ด€์‹ฌ์„ ํ‘œ๋ช…ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๊ฒฐ๊ตญ ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฆฐํŠธ ๊ทœ์น™์„ ์™„ํ™”ํ–ˆ๊ณ  ์–ด๋–ป๊ฒŒ ์ง„ํ–‰๋˜๋Š”์ง€ ๋ด…์‹œ๋‹ค. ):

์ด ๊ธฐ๋Šฅ์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๊ตฌ๋… - ์ด๊ฒƒ๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ๋„ˆ๋ฌด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค :(

์—ฌ๊ธฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€! ์šฐ๋ฆฌ๋Š” Vuejs์™€ ํ•จ๊ป˜ typescript๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ํŒŒ์ผ์€ ํ…Œ์ŠคํŠธ ๋””๋ ‰ํ† ๋ฆฌ์— ํ•จ๊ป˜ ์žˆ์ง€ ์•Š๊ณ  ๊ตฌ์„ฑ ์š”์†Œ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋”ฐ๋ผ ๋ชจ๋“  ๊ณณ์— ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ช…๋ น์ค„ ๋ฆฐํŠธ๊ฐ€ ๊ฐ•์กฐ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹ค๋ฅธ ๋ฆฐํŠธ ์˜ค๋ฅ˜๋ฅผ โ€‹โ€‹vscode๊ฐ€ ๊ฐ•์กฐ ํ‘œ์‹œํ•˜๋Š” ์•ฝ๊ฐ„ ์ด์ƒํ•œ ์„ค์ •์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์ด ๊ตฌํ˜„๋  ์ง€๋Š” ๋งค์šฐ ์˜์‹ฌ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. tslint๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ ๊ทน์ ์œผ๋กœ ์œ ์ง€ ๊ด€๋ฆฌ๋˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. @typescript-eslint ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. eslint ๋ฐ ts ํ”„๋กœ์ ํŠธ ๋ชจ๋‘์—์„œ ์™„์ „ํ•œ ์ง€์›์„ ๋ฐ›์•˜๊ณ  @typescript-eslint/eslint-plugin-tslint ๋ฅผ ์‚ฌ์šฉ ํ•˜๋ฉด ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด ๊ทธ ์–ด๋Š ๋•Œ๋ณด๋‹ค ์‰ฝ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ tslint ๋ฐ ํ•ด๋‹น eslint ๊ทœ์น™/๊ธฐํƒ€ ๋Œ€์•ˆ์ด ์žˆ๋Š” compat ํ…Œ์ด๋ธ” ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Eslint ์„ค์ •์€ ์‚ฌ์šฉ์ž ์ •์˜๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ tslint๋ฅผ ๊ณ ์ˆ˜ํ•  ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

.gitIgnore...์— ์žˆ๋Š” ํŒŒ์ผ์— ๋Œ€ํ•ด git ์ €์žฅ์†Œ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋…์„ tsLint ๊ทœ์น™์— ์ ์šฉํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ํ•˜์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋ฆฐํŠธํ•  ๋•Œ ์žฌ์ •์˜ ํŒŒ์ผ๊ณผ ํ•จ๊ป˜ ๋ฆฐํ„ฐ์— ๋Œ€ํ•œ ์ปจํ…์ŠคํŠธ๋กœ ํ˜„์žฌ ๊ณ„์ธต์  ์œ„์น˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์›ํ•˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ ์ˆ˜์ค€์—์„œ ๊ตฌ์„ฑ์„ ํฌํ•จํ•˜๊ฑฐ๋‚˜ ์ œ์™ธํ•˜๊ณ  ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ
tslint ๊ตฌ์„ฑ์€ ๋ฃจํŠธ์— ๋ฐฐ์น˜๋˜๊ณ  ์†Œ์Šค ์ฝ”๋“œ ๊ตฌ์กฐ์˜ ํŠน์ • ์ˆ˜์ค€์—์„œ ๋‹ค๋ฅธ ๋™์ž‘์„ ์›ํ•  ๊ฒฝ์šฐ ํ•ด๋‹น ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ์˜ ๋ฃจํŠธ์— ์žˆ๋Š” ํ™•์žฅ tslint ํŒŒ์ผ๋กœ ์ด๋ฅผ ์žฌ์ •์˜ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

@redevill test ํด๋”์— ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ตฌ์„ฑ ์š”์†Œ/์„œ๋น„์Šค์˜ ๋™์ผํ•œ ํด๋”์— something.test.ts ๋กœ ์“ฐ๊ธฐ ํ…Œ์ŠคํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋™์˜ํ•จ - ๊ทธ๋Ÿฌ๋‚˜ ์•ฝ๊ฐ„์˜ ๋ณ€๊ฒฝ: (ํ…œํ”Œ๋ฆฟ ์ƒ์„ฑ๊ธฐ๋กœ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ์Œ(CLI ์Šคํƒ€์ผ)
MyComponentDir
---MyComponentTestsDir
------tslint.test.json
------something.test.ts
---mycomponent.component.css
---mycomponent.component.html
---mycomponent.component.ts

๊ทธ ์•„์ด๋””์–ด๋Š” ์—ฌ์ „ํžˆ ์œ ํšจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์ œ์•ˆ์˜ ์—ด๋ ฌํ•œ ํŒฌ์ž…๋‹ˆ๋‹ค. ์˜ˆ, ๋ถ€ํƒํ•ฉ๋‹ˆ๋‹ค! ๋‚ด๊ฐ€ ์„ ํ˜ธํ•˜๋Š” ๊ฒƒ์€ Overrides ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

Btw, tslint์˜ ์‚ฌ์šฉ ์ค‘๋‹จ ๋ฐœํ‘œ๋ฅผ ๊ฐ์•ˆํ•  ๋•Œ ์ด ๋‹จ๊ณ„์—์„œ ๊ทธ๋ ‡๊ฒŒ ํฐ ๋ณ€๊ฒฝ์ด ์ด๋ฃจ์–ด์งˆ ๊ฒƒ์ด๋ผ๊ณ  _์ •๋ง__ ์ƒ์ƒํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ํŒ€์€ ์ด๋ฏธ ๊ทœ์น™๋ณ„ + ํŒŒ์ผ๋ณ„ ์žฌ์ •์˜ ๊ธฐ๋Šฅ์ด ์žˆ๋Š” eslint๋กœ ์ด๋™ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์•ž์„œ ์–ธ๊ธ‰ํ•œ ๋ฐœํ‘œ: https://medium.com/palantir/tslint-in-2019-1a144c2317a9

@RoystonS ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์˜ณ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํฐ ๊ธฐ๋Šฅ์€ ์ด ์‹œ์ ์—์„œ tslint์— ์ถ”๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. #4534 ์ฐธ์กฐ

์šฐ๋ฆฌ๋Š” Angular ํ”„๋กœ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์žฌ์ •์˜ ๊ฐœ๋…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๊ณ ํ†ต์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰

๊ด€๋ จ ๋ฌธ์ œ

mrand01 picture mrand01  ยท  3์ฝ”๋ฉ˜ํŠธ

denkomanceski picture denkomanceski  ยท  3์ฝ”๋ฉ˜ํŠธ

DanielKucal picture DanielKucal  ยท  3์ฝ”๋ฉ˜ํŠธ

Ne-Ne picture Ne-Ne  ยท  3์ฝ”๋ฉ˜ํŠธ

zewa666 picture zewa666  ยท  3์ฝ”๋ฉ˜ํŠธ