Tslint: 컴파일러 μ˜΅μ…˜ 'ν™•μž₯'μ—λŠ” λ¬Έμžμ—΄ μœ ν˜•μ˜ 값이 ν•„μš”ν•©λ‹ˆλ‹€.

에 λ§Œλ“  2018λ…„ 01μ›” 11일  Β·  17μ½”λ©˜νŠΈ  Β·  좜처: palantir/tslint

버그 μ‹ κ³ 

  • __TSLint 버전__: 5.9.1
  • __TypeScript 버전__: 2.6.2
  • ____λ₯Ό 톡해 TSLint μ‹€ν–‰ν•˜κΈ°: CLI

λ¦°νŠΈλ˜λŠ” TypeScript μ½”λ“œ

// code snippet

tslint.json ꡬ성:

{
    "defaultSeverity": "error",
    "extends": [
         "tslint-eslint-rules"
     ],
    "jsRules": {},
    "rules": {}
}

μ‹€μ œ 행동

μ˜ˆμƒλ˜λŠ” 행동

Not A Bug

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

@StanLee12 μ‚¬μš© 쀑인 μ •ν™•ν•œ CLI μΈμˆ˜λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ? 이 μŠ€λ ˆλ“œμ˜ λ‹€λ₯Έ 리포터와 λ™μΌν•œ 잘λͺ»λœ 섀정을 μ‚¬μš©ν•˜κ³  μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. --project ν”Œλž˜κ·ΈλŠ” tslint.json μ•„λ‹ˆλΌ tsconfig.json νŒŒμΌμ„ κ°€λ¦¬μΌœμ•Ό ν•©λ‹ˆλ‹€.

@MartijnKooij v5.9의 tslint.json μ—μ„œ extends κΈ°λŠ₯ κ΅¬ν˜„μ— λͺ‡ 가지 λ³€κ²½ 사항이 μžˆμ–΄ μ‹€μˆ˜λ‘œ 잘λͺ»λœ 섀정이 μž‘λ™μ„ λ©ˆμ·„μŠ΅λ‹ˆλ‹€. μœ„μ—μ„œ λ§ν–ˆλ“―μ΄ --project λŠ” tsconfig.json νŒŒμΌμ„ κ°€λ¦¬μΌœμ•Ό ν•©λ‹ˆλ‹€. TSLint λ¬Έμ„œ 쀑 μ–΄λŠ 것도 --project path/to/tslint.json κ°€ μ§€μ›λ˜λŠ” μ‚¬μš© νŒ¨ν„΄μ΄λΌκ³  μ£Όμž₯ν•œ 적이 μ—†μŠ΅λ‹ˆλ‹€.

λͺ¨λ“  17 λŒ“κΈ€

tslint.json λ₯Ό λ‹€μŒμœΌλ‘œ λ³€κ²½ν•  λ•Œ

{
    "defaultSeverity": "error",
    "extends":  "tslint-eslint-rules",
    "jsRules": {},
    "rules": {}
}

A path in an 'extends' option must be relative or rooted, but 'tslint-eslint-rules' is not

tslint-eslint-rules 의 경둜λ₯Ό μ–΄λ–»κ²Œ 얻을 수 μžˆμŠ΅λ‹ˆκΉŒ?

tslint.json 와 tsconfig.json ν˜Όλ™ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” ν˜Όλž€μŠ€λŸ½μ§€ μ•Šλ‹€κ³  ν™•μ‹ ν•©λ‹ˆλ‹€. 5.8.1 λ²„μ „μ—μ„œλŠ” λ§žμŠ΅λ‹ˆλ‹€.

여기에 같은 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€.
변경됨

"extends": [
    "tslint:recommended"
  ],

NS

"extends": "./node_modules/tslint/lib/configs/recommended"

κ³ μΉ˜λ‹€.

A path in an 'extends' option must be relative or rooted, but 'xxx' is not λŠ” tsconfig .json이 잘λͺ»λœ 경우 typescript μ»΄νŒŒμΌλŸ¬μ—μ„œ κ°€μ Έμ˜΅λ‹ˆλ‹€. λ”°λΌμ„œ -p tslint.json μ€‘μ΄κ±°λ‚˜ tslint.json에 μžˆμ–΄μ•Ό ν•˜λŠ” μ½˜ν…μΈ κ°€ tsconfig.json에 μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

여기에 또 λ‹€λ₯Έ ν˜Όλž€μŠ€λŸ¬μš΄ μ‚¬μš©μžκ°€ μžˆμŠ΅λ‹ˆλ‹€.
λ‹€μŒμ„ μ‚¬μš©ν•˜μ—¬ CLIμ—μ„œ tslintλ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€.
"lint": "tslint --project tslint.json -e src/**/*.spec.*",

이것은 μ§€λ‚œ 1λ…„ λ™μ•ˆ 잘 μž‘λ™ν–ˆμŠ΅λ‹ˆλ‹€. μ§€κΈˆ μš°λ¦¬λŠ” tslint 5.9.1둜 μ—…λ°μ΄νŠΈν–ˆκ³  λ™μΌν•œ 였λ₯˜κ°€ ν‘œμ‹œλ©λ‹ˆλ‹€.

error TS5024: Compiler option 'extends' requires a value of type string.

우리의 tslint.json μ—λŠ” λ‹€μŒ 2개의 ν™•μž₯이 μžˆμŠ΅λ‹ˆλ‹€.

{
    "extends": [
        "tslint:recommended",
        "tslint-sonarts"
    ],

λ³€κ²½λœ 사항과 이 문제λ₯Ό λ‹€μ‹œ κ³ μΉ  수 μžˆλŠ” 방법에 λŒ€ν•΄ μ’€ 더 μžμ„Ένžˆ μ•Œλ €μ£Όμ‹œκ² μŠ΅λ‹ˆκΉŒ?

μ‹€μ œλ‘œ 관련이 μžˆλŠ” 경우 tsconfigλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

{
    "compileOnSave": false,
    "compilerOptions": {
        "lib": [
            "dom",
            "es2015"
        ],
        "noImplicitAny": false,
        "target": "es5",
        "rootDir": "src",
        "emitDecoratorMetadata": true,
        "experimentalDecorators": true,
        "sourceMap": true,
        "jsx": "preserve",
        "baseUrl": "src",
        "types": [
            "p-elements-core",
            "@types/jasmine",
            "@types/underscore",
            "@types/requirejs",
            "../../src/types"
        ]
    }
}

@StanLee12 μ‚¬μš© 쀑인 μ •ν™•ν•œ CLI μΈμˆ˜λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ? 이 μŠ€λ ˆλ“œμ˜ λ‹€λ₯Έ 리포터와 λ™μΌν•œ 잘λͺ»λœ 섀정을 μ‚¬μš©ν•˜κ³  μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. --project ν”Œλž˜κ·ΈλŠ” tslint.json μ•„λ‹ˆλΌ tsconfig.json νŒŒμΌμ„ κ°€λ¦¬μΌœμ•Ό ν•©λ‹ˆλ‹€.

@MartijnKooij v5.9의 tslint.json μ—μ„œ extends κΈ°λŠ₯ κ΅¬ν˜„μ— λͺ‡ 가지 λ³€κ²½ 사항이 μžˆμ–΄ μ‹€μˆ˜λ‘œ 잘λͺ»λœ 섀정이 μž‘λ™μ„ λ©ˆμ·„μŠ΅λ‹ˆλ‹€. μœ„μ—μ„œ λ§ν–ˆλ“―μ΄ --project λŠ” tsconfig.json νŒŒμΌμ„ κ°€λ¦¬μΌœμ•Ό ν•©λ‹ˆλ‹€. TSLint λ¬Έμ„œ 쀑 μ–΄λŠ 것도 --project path/to/tslint.json κ°€ μ§€μ›λ˜λŠ” μ‚¬μš© νŒ¨ν„΄μ΄λΌκ³  μ£Όμž₯ν•œ 적이 μ—†μŠ΅λ‹ˆλ‹€.

μΆ”κ°€ μ„€λͺ…에 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€. @ajafffκ°€ --project λ§€κ°œλ³€μˆ˜λ‘œ tsconfig λŒ€μ‹  tslintλ₯Ό μ‚¬μš©ν•œλ‹€κ³  λ§ν–ˆμ„ λ•Œ 이해 ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.
λ‚΄ 생각에 μ–΄λ”˜κ°€μ— 이 였λ₯˜κ°€ ν¬ν•¨λœ tslint μ‚¬μš©μ— λŒ€ν•œ λΈ”λ‘œκ·Έ κ²Œμ‹œλ¬Όμ΄ μžˆμŠ΅λ‹ˆλ‹€.
이에 λŒ€ν•œ https://palantir.github.io/tslint/usage/cli/의 λ¬Έμ„œλŠ” μ •ν™•ν•©λ‹ˆλ‹€. 적어도 μ§€κΈˆμ€ κ·Έλ ‡μŠ΅λ‹ˆλ‹€.)

λ‹€μ‹œ ν•œ 번 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€. μ™„μ „μ„±κ³Ό 기타 사항에 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€. μš°λ¦¬λŠ” λ³€κ²½:
"lint": "tslint --project tslint.json -e src/**/*.spec.*",
μ΄κ²ƒμœΌλ‘œ
"lint": "tslint --project tsconfig.json -e src/**/*.spec.*",

@ajafff @adidahiya 정말 μ£„μ†‘ν•©λ‹ˆλ‹€ 제 잘λͺ»μ΄μ—μš” 정말 κ°μ‚¬ν•©λ‹ˆλ‹€!

이 문제둜 인해 mocha-tslint도 더 이상 μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 그리고 configFilePathλŠ” tslint.json을 κ°€λ¦¬μΌœμ•Ό ν•©λ‹ˆλ‹€. λŒ€μ‹  tsconfig.json을 μ‚¬μš©ν•˜λŠ” 경우:
const lint = require('mocha-tslint'); const configFilePath = './tsconfig.json'; lint(configFilePath);
λ‚˜λŠ”μ΄ κ²°κ³Όλ₯Ό μ–»λŠ”λ‹€ :
tslint No valid rules have been specified

항상 5.8κ³Ό ν•¨κ»˜ μž‘λ™ν–ˆμŠ΅λ‹ˆλ‹€.

@DaveXCS mocha-tslint κ°€ λ­”κ°€ 잘λͺ»ν•΄μ„œ λ°œμƒν–ˆμ„ κ°€λŠ₯성이 ν½λ‹ˆλ‹€. λ‚˜λŠ” 그듀이 private API (runner.ts)λ₯Ό μ‚¬μš©ν•˜κ³  ꡬ성 νŒŒμΌμ„ -c AND -p 인수둜 μ‚¬μš©ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

mocha-tslint의 문제λ₯Ό μ΄ν•΄ν•˜λ €κ³  ν–ˆμ§€λ§Œ μ—¬κΈ°μ—μ„œ λ¬Έμ œκ°€ 보이지 μ•ŠμŠ΅λ‹ˆλ‹€.
const tslintConfig = Configuration.loadConfigurationFromPath(configFilePath); fileNames.forEach((file) => test(file, tslintConfig));
const TSLint = require('tslint'); const Linter = TSLint.Linter; const Configuration = TSLint.Configuration;
fs.readFile(file, (err, sourceBuffer) => { const linter = new Linter(options); const source = sourceBuffer.toString(); linter.lint(file, source.toString(), config);

@DaveXCS λ¬Έμ œλŠ” λ‹€μŒ μ€„μž…λ‹ˆλ‹€. https://github.com/t-sauer/mocha-tslint/blob/0ba7f64be458cd74343a4149dff323d5bfd195a5/index.js#L24
이 경둜λ₯Ό ν†΅κ³Όν•˜μ§€ μ•Šμ•„μ•Ό tslint.json (A)에 λŒ€ν•œ 경둜 ν•„μš”ν•œ ν•¨μˆ˜ tsconfig.json

λ‚˜λŠ” 당신을 μœ„ν•΄ 문제λ₯Ό μ—΄μ—ˆμŠ΅λ‹ˆλ‹€ : https://github.com/t-sauer/mocha-tslint/issues/9

λ‹Ήμ‹ μ˜ 도움을 μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€.
cli의 --projectλ₯Ό tslint.json λŒ€μ‹  tsconfig.json으둜 λ°”κΎΈκ³  "mocha-tslint"(μœ ν˜• 검사도 포함)λ₯Ό λ‹€μ‹œ μž‘μ„±ν–ˆμŠ΅λ‹ˆλ‹€.
https://gist.github.com/DaveXCS/3bd930f7093b748f551c99e80d57c578

이것은 좩격적으둜 λ¬Έμ„œν™”λ˜μ§€ μ•Šμ•˜μœΌλ©° ν˜Όλž€μŠ€λŸ½κ³  μ „ν˜€ 직관적이지 μ•ŠμŠ΅λ‹ˆλ‹€.

@devguyrun CLI μ‚¬μš© λ¬Έμ„œ λŠ” --project λ₯Ό tsconfig.json νŒŒμΌμ„ μ—¬λŸ¬ 번 가리킀도둝 μ§€μ‹œν•©λ‹ˆλ‹€. 더 λͺ…ν™•ν•΄μ§ˆ 수 μžˆλ‹€κ³  μƒκ°λ˜λ©΄ 자유둭게 PR을 λ³΄λ‚΄μ‹­μ‹œμ˜€.

였λ₯˜ TS18001: 'ν™•μž₯' μ˜΅μ…˜μ˜ κ²½λ‘œλŠ” μƒλŒ€ λ˜λŠ” λ£¨νŠΈμ—¬μ•Ό ν•˜μ§€λ§Œ '<%= sourcedir.split('/').map(x => '..').join('/') %

/tsconfig.json'이 μ•„λ‹™λ‹ˆλ‹€.

λ‹€λ₯Έ 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰