๋ฆฐํธ๋๋ ์ฝ๋๊ฐ ํ ์คํธ ์ฝ๋์ธ์ง ์ฌ๋ถ์ ๋ฐ๋ผ ๋ฆฐํธ ๊ฒ์ฌ๋ฅผ ์กฐ๊ฑด๋ถ๋ก ์ํํ๋ ค๋ ์ํฉ์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์์ ํ์ง ์๊ธฐ ๋๋ฌธ์ ํ๋ก๋์ ์ฝ๋์์ '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"]
}
}
}
(์ฌ๋ฌ ๋ฒ ์ฌ์ ์๋ ํ์ฉํ๋ ค๋ฉด ๋ฐฐ์ด์ด์ด์ผ ํฉ๋๋ค.)
ํ
์คํธ์ ํ๋ก๋์
์ฝ๋๋ฅผ ๋ณ๋์ ๋๋ ํ ๋ฆฌ์ ๋ฃ์ผ๋ฉด ๊ทธ๋ฌํ ๊ธฐ๋ฅ์ด ํ์ํ์ง ์์ต๋๋ค. ๊ตฌ์ฑ ํ์ผ์ 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, ๊ท์น 2foo.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"
์น์
์๋ ์ฌ์ ์ ๋ฐฐ์ด์ด ํฌํจ๋์ด ์์ต๋๋ค."files"
)์ ์ง์ ํ ์ ์์ต๋๋ค. ๋ ์ค ํ๋๊ฐ ์ผ์นํ๋ฉด ๊ตฌ์ฑ์ด ์ ์ฉ๋ฉ๋๋ค."excludedFiles"
์ด ๋์์ 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 ํ๋ก์ ํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ฌ์ ์ ๊ฐ๋ ์ด ํ์ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ด๋ฆฌํ๋ ๊ฒ์ด ๊ณ ํต์ค๋ฝ์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ค์ฒฉ์ ์ฌ๊ธฐ์ ๋ ผ์๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ๋ชปํฉ๋๋ค. ๋ง์ ์ฌ๋๋ค ์ด ํ ์คํธํ๋ ์ฝ๋์ ๋์ผํ ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ์์ ํ ์คํธ๋ฅผ ์ํํ๊ธฐ๋ฅผ ์ํ๋ฉฐ ํ์ฌ๋ก์๋ tslint๋ก ๊ทธ๋ ๊ฒ ํ ์ ์๋ ์ข์ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.