Tslint: μ•”μ‹œμ  쒅속성 μ—†μŒ: 경둜 맀핑 지원

에 λ§Œλ“  2017λ…„ 10μ›” 20일  Β·  18μ½”λ©˜νŠΈ  Β·  좜처: palantir/tslint

버그 μ‹ κ³ 

  • __TSLint 버전__: 5.8.0
  • __TypeScript 버전__: 2.7.0-dev.20171020
  • ____λ₯Ό 톡해 TSLint μ‹€ν–‰ν•˜κΈ°: CLI

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

src/a.ts

import { x } from "foo";

μœ ν˜•/foo.d.ts

export const x = 0;

tsconfig.json

{
    "compilerOptions": {
        "paths": {
            "*": "types/*"
        }
    }
}

tslint.json ꡬ성:

{
    "rules": {
        "no-implicit-dependencies": true
    }
}

μ‹€μ œ 행동

ERROR: /home/andy/sample/tslint/src/a.ts[1, 19]: Module 'foo' is not listed as dependency in package.json

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

였λ₯˜κ°€ μ—†μŠ΅λ‹ˆλ‹€. κ°€μ Έμ˜€κΈ°κ°€ node_modules 에 μžˆλŠ” κ²ƒμœΌλ‘œ ν•΄κ²°λ˜μ§€ μ•ŠμœΌλ©΄ 이 κ·œμΉ™μ€ 이λ₯Ό λ¬΄μ‹œν•΄μ•Ό ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

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

이 κ·œμΉ™μ€ 자체 μ†ŒμŠ€ μ½”λ“œμ— 별칭을 μ‚¬μš©ν•  λ•Œ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€(npm νŒ¨ν‚€μ§€μ—μ„œ κ°€μ Έμ˜€μ§€ μ•ŠμŒ). μƒλŒ€ 경둜 λŒ€μ‹  μ ˆλŒ€ 경둜λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 맀우 μœ μš©ν•©λ‹ˆλ‹€.
tsconfig.jsonμ—μ„œ 각도 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 경우 λ‹€μŒμ„ μΆ”κ°€ν•˜κΈ°λ§Œ ν•˜λ©΄ λ©λ‹ˆλ‹€.

"compilerOptions": {
  ...
  "baseUrl": "./src",
  "paths": {
    "~/env": ["environments/environment"],
    "~/*": ["app/*"]
  }
}

그런 λ‹€μŒ λ‹€μŒκ³Ό 같은 κ°€μ Έμ˜€κΈ°λ₯Ό μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

import {FooService} from '~/core';
import {Environment} from '~/env';

이 경우λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ 이 문제λ₯Ό λ‹€μ‹œ μ—΄μ–΄μ•Ό ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€(node_modulesλŠ” ν•„μš”ν•˜μ§€ μ•ŠμœΌλ©° tsconfig.json 파일만 있으면 됨).
λ‚˜λŠ” 이 κ·œμΉ™μ— κ°μ‚¬ν•˜κΈ° λ•Œλ¬Έμ— 그것을 λΉ„ν™œμ„±ν™”ν•˜λŠ” 것은 λΆˆν–‰ν•œ μΌμž…λ‹ˆλ‹€.

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

κ°€μ Έμ˜€κΈ°κ°€ node_modules의 λ¬΄μ–Έκ°€λ‘œ ν•΄κ²°λ˜μ§€ μ•ŠμœΌλ©΄ 이 κ·œμΉ™μ€ 이λ₯Ό λ¬΄μ‹œν•΄μ•Ό ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

κ·œμΉ™μ€ λͺ¨λ“ˆμ„ ν•΄κ²°ν•˜λ €κ³  ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ΄λŠ” λͺ¨λ“  쒅속성을 μ„€μΉ˜ν•΄μ•Ό 함을 μ˜λ―Έν•©λ‹ˆλ‹€. μ΄λŠ” peerDependencies 및 optionalDependenciesμ—μ„œλŠ” μ‹€μ œλ‘œ λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€. ν˜„μž¬ κ΅¬ν˜„μ„ μ‚¬μš©ν•˜λ©΄ 아무 것도 μ„€μΉ˜ν•˜μ§€ μ•Šκ³ λ„ μƒˆλ‘œμš΄ 클둠을 λ¦°νŠΈν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이것이 λŒ€λΆ€λΆ„μ˜ μ½”λ“œ ν’ˆμ§ˆ 도ꡬ가 ν•˜λŠ” 일이라고 μƒκ°ν•©λ‹ˆλ‹€.

경둜 맀핑을 μ΄ν•΄ν•˜λ©΄ 컴파일 μ‹œκ°„μ—λ§Œ μ‘΄μž¬ν•©λ‹ˆλ‹€. λŸ°νƒ€μž„ μ‹œ λ…Έλ“œ/μ›ΉνŒ©/무엇이든 μ˜¬λ°”λ₯΄κ²Œ μ„ νƒν•˜λ €λ©΄ λͺ¨λ“ˆμ„ μ„€μΉ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.
즉, 경둜 맀핑은 컴파일 쀑에 μƒλž΅λœ ν˜•μ‹λ§Œ κ°€μ Έμ˜€κΈ°κ°€ μžˆλŠ” κ²½μš°μ—λ§Œ 관련이 μžˆμŠ΅λ‹ˆλ‹€. 이 경우 κ·œμΉ™μ€ μ•„λ§ˆλ„ λ‹Ήμ‹ μ—κ²Œ μ˜¬λ°”λ₯Έ 선택이 아닐 κ²ƒμž…λ‹ˆλ‹€.

우리의 경우 일반적으둜 package.json κ°€ μ „ν˜€ μ—†μœΌλ―€λ‘œ 이 κ·œμΉ™μ„ λΉ„ν™œμ„±ν™”ν•΄μ•Ό ν•©λ‹ˆλ‹€. 감사 ν•΄μš”!

제 κ²½μš°μ—λŠ” 경둜 맀핑을 μ‚¬μš©ν•˜μ—¬ λ™μ‹œμ— μž‘μ—… 쀑인 λ³„λ„μ˜ typescript ν”„λ‘œμ νŠΈλ₯Ό "κ°€μ Έμ˜€κΈ°" μ€‘μž…λ‹ˆλ‹€.

"compilerOptions": {
    ...
    "paths": {
        "tsbase": ["../tsBaseProject/src"],
        "tslibrary": ["../tsProjectLibrary/src"]
    }
}

λͺ¨λ“ˆμΈ κ²ƒμ²˜λŸΌ ν”„λ‘œμ νŠΈμ—μ„œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
그듀을 ν™”μ΄νŠΈλ¦¬μŠ€νŠΈμ— μΆ”κ°€ν•˜λŠ” 방법이 μžˆμŠ΅λ‹ˆκΉŒ?

@marcoqu 경둜 맀핑은 컴파일 μ‹œκ°„μ—λ§Œ 관련이 μžˆμŠ΅λ‹ˆλ‹€. λŸ°νƒ€μž„μ— μ΄λŸ¬ν•œ λͺ¨λ“ˆμ€ node_modules에 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. dependencies λ˜λŠ” peerDependencies 둜 package.json에 μΆ”κ°€ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

보쑰 ν”„λ‘œμ νŠΈλ₯Ό "κ°€μ Έμ˜€λŠ”" μ£Ό μ†ŒμŠ€λ₯Ό μ»΄νŒŒμΌν•˜λ©΄ λͺ¨λ“  것이 ν”„λ‘œμ νŠΈμ˜ μ‹€μ œ 폴더인 κ²ƒμ²˜λŸΌ 단일 λ²ˆλ“€λ‘œ μ»΄νŒŒμΌλ©λ‹ˆλ‹€. node_modules 폴더에 λ‘˜ ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.
λΆ„λͺ…νžˆ ν•˜μžλ©΄, 보쑰 ν”„λ‘œμ νŠΈ ν΄λ”μ—λŠ” μœ ν˜• μ„ μ–ΈλΏλ§Œ μ•„λ‹ˆλΌ μ‹€μ œ .ts 파일이 μžˆμŠ΅λ‹ˆλ‹€.

no-submodule-imports와 같은 ν™”μ΄νŠΈλ¦¬μŠ€νŠΈ 좔가에 +1

λ˜ν•œ μƒλŒ€ κ°€μ Έμ˜€κΈ°λ₯Ό ν”Όν•˜κΈ° μœ„ν•΄ κΈ°λ³Έ 디렉토리에 경둜 별칭 '~'을 μ •μ˜ν•˜λŠ” 경우λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. 이 별칭은 λ‚˜μ€‘μ— webpack, fuse-box 등에 μ˜ν•΄ ν•΄κ²°λ©λ‹ˆλ‹€. 5.8λΆ€ν„° tslintλŠ” 이 λ•Œλ¬Έμ— λ§Žμ€ κ°€μ§œ 였λ₯˜λ₯Ό λ±‰μ–΄λƒ…λ‹ˆλ‹€...

κ·Έκ°€ ν•œ 말^^

μ—…κ·Έλ ˆμ΄λ“œ ν›„ μœ„μ—μ„œ μ„€λͺ…ν•œ 것과 같은 이유둜 μ΄λŸ¬ν•œ 였λ₯˜κ°€ 수백 개 μžˆμŠ΅λ‹ˆλ‹€. μΌμ’…μ˜ λ¬΄μ˜λ―Έν•œ κ·œμΉ™.

이 κ·œμΉ™μ€ 자체 μ†ŒμŠ€ μ½”λ“œμ— 별칭을 μ‚¬μš©ν•  λ•Œ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€(npm νŒ¨ν‚€μ§€μ—μ„œ κ°€μ Έμ˜€μ§€ μ•ŠμŒ). μƒλŒ€ 경둜 λŒ€μ‹  μ ˆλŒ€ 경둜λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 맀우 μœ μš©ν•©λ‹ˆλ‹€.
tsconfig.jsonμ—μ„œ 각도 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 경우 λ‹€μŒμ„ μΆ”κ°€ν•˜κΈ°λ§Œ ν•˜λ©΄ λ©λ‹ˆλ‹€.

"compilerOptions": {
  ...
  "baseUrl": "./src",
  "paths": {
    "~/env": ["environments/environment"],
    "~/*": ["app/*"]
  }
}

그런 λ‹€μŒ λ‹€μŒκ³Ό 같은 κ°€μ Έμ˜€κΈ°λ₯Ό μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

import {FooService} from '~/core';
import {Environment} from '~/env';

이 경우λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ 이 문제λ₯Ό λ‹€μ‹œ μ—΄μ–΄μ•Ό ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€(node_modulesλŠ” ν•„μš”ν•˜μ§€ μ•ŠμœΌλ©° tsconfig.json 파일만 있으면 됨).
λ‚˜λŠ” 이 κ·œμΉ™μ— κ°μ‚¬ν•˜κΈ° λ•Œλ¬Έμ— 그것을 λΉ„ν™œμ„±ν™”ν•˜λŠ” 것은 λΆˆν–‰ν•œ μΌμž…λ‹ˆλ‹€.

@andy-ms 지원 경둜λ₯Ό μž¬κ³ ν•΄ μ£Όμ„Έμš”(nx μž‘μ—… κ³΅κ°„μ—μ„œ κ΄‘λ²”μœ„ν•˜κ²Œ μ‚¬μš©). 이것은 정말 μœ μš©ν•œ κ·œμΉ™μ΄μ§€λ§Œ μ§€κΈˆμ€ κ°•μ œλ‘œ λΉ„ν™œμ„±ν™”ν•©λ‹ˆλ‹€.

μ†ŒμŠ€ μ½”λ“œλ₯Ό μ‚΄νŽ΄λ³΄κ³  μˆ˜μ •ν•΄μ•Ό ν•  λΆ€λΆ„ 은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€ . λ˜ν•œ Typescriptκ°€ 이λ₯Ό μ²˜λ¦¬ν•˜λŠ” 방법을 ν™•μΈν–ˆμœΌλ©° 이 κΈ°λŠ₯ κΉŒμ§€ μΆ”μ ν–ˆμŠ΅λ‹ˆλ‹€. κ·Έ 논리λ₯Ό λ³΅μ œν•˜λŠ” 것은 ν™•μ‹€νžˆ μ‰¬μš΄ 일이 μ•„λ‹™λ‹ˆλ‹€. κ·Έ κΈ°λŠ₯을 μž¬μ‚¬μš©ν•  수 μžˆλŠ”μ§€ ν™•μ‹€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. ν™•μ‹€ν•˜μ§€ μ•Šμ€ μΈμˆ˜κ°€ 많이 μžˆμŠ΅λ‹ˆλ‹€.

이것도 고쳐쑌으면 ν•˜λŠ” λ°”λž¨μž…λ‹ˆλ‹€. 경둜 맀핑은 맀우 κ°€μΉ˜ μžˆλŠ” κΈ°λŠ₯μž…λ‹ˆλ‹€. λ˜ν•œ ν•΄κ²° λ°©λ²•μœΌλ‘œ μ—°κ²°λœ λͺ¨λ“ˆμ„ μ‚¬μš©ν•΄ λ³΄μ•˜μ§€λ§Œ μ§€μ›λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

문제λ₯Ό μ–΄λŠ 정도 ν•΄κ²°ν•  수 μžˆλŠ” ν•΄κ²° 방법을 μ°Ύμ•˜μ§€λ§Œ λͺ¨λ“  μ‚¬λžŒμ—κ²Œ ν•΄λ‹Ήλ˜λŠ”μ§€ λ˜λŠ” μœ μ§€ 관리가 κ°€λŠ₯ν•œμ§€ ν™•μ‹€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ–΄μ¨Œλ“  ν•΄κ²° 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

에 κ°€μ§œ νŒ¨ν‚€μ§€λ₯Ό μΆ”κ°€ optionalDependencies μ—μ„œ 경둜 맡의 이름 tsconfig.json , 및 μ‚¬μš© 쒅속성을 μ„€μΉ˜ npm install --no-optional . 이것은 λΆˆν–‰νžˆλ„ yarn --ignore-optional μ—μ„œλŠ” μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ—¬μ „νžˆ νŒ¨ν‚€μ§€λ₯Ό κ°€μ Έμ˜€λŠ” 데 μ‹€νŒ¨ν•©λ‹ˆλ‹€.

λ”°λΌμ„œ tsconfig.json κ²½λ‘œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

    "paths": {
        "~/*": ["src/*"],
        "some-path/*": ["whatever/*"]
    }

그리고 λ‹€μŒκ³Ό 같이 package.json μ—μ„œ 선택 사항:

    "optionalDependencies": {
        "~": "tslint-hack",
        "some-path": "tslint-hack"
    },

npm install --no-optional μ‚¬μš©ν•˜μ—¬ μ„€μΉ˜ν•  ν”„λ‘œλ•μ…˜ 및 개발 쒅속성을 얻을 수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. 이것은 λΆ„λͺ…νžˆ 선택적 쒅속성을 μ„€μΉ˜ν•  ν•„μš”κ°€ μ—†λ‹€κ³  κ°€μ •ν•©λ‹ˆλ‹€. λ˜ν•œ νŒ¨ν‚€μ§€ μ΄λ¦„μœΌλ‘œ @ λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ•˜λ‹€λŠ” 점을 μ–ΈκΈ‰ν•  κ°€μΉ˜κ°€ μžˆμŠ΅λ‹ˆλ‹€.

당신은 μΆ”κ°€ μ•„λ§ˆ 슀마트 될 μˆ˜μžˆλŠ”μ΄ 해킹을 μ‚¬μš©ν•˜λ„λ‘ μ„ νƒν•˜λŠ” 경우 .npmrc 와 ν•¨κ»˜, ν”„λ‘œμ νŠΈ λ£¨νŠΈμ— νŒŒμΌμ„ optional=false μ‹€ν–‰μœΌλ‘œ λŒμ•„κ°ˆ 수 μžˆλ„λ‘ ꡬ성 npm install ν•˜μ§€ μ•Šκ³  --no-optional ν”Œλž˜κ·Έ.

μž‘λ™ _ν•΄μ•Ό ν•˜λŠ”_ 또 λ‹€λ₯Έ μ†”λ£¨μ…˜μ€ μ‹€μ œλ‘œ μ›ν•˜λŠ” μ΄λ¦„μœΌλ‘œ νŒ¨ν‚€μ§€λ₯Ό λ§Œλ“€κ³  verdaccio λ˜λŠ” 이와 μœ μ‚¬ν•œ 것을 μ‚¬μš©ν•˜μ—¬ 개인 λ ˆμ§€μŠ€νŠΈλ¦¬μ— κ²Œμ‹œν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. .npmrc λ˜λŠ” .yarnrc μ‚¬μš©ν•˜μ—¬ λͺ¨λ“ˆλ‹Ή 개인 λ ˆμ§€μŠ€νŠΈλ¦¬λ₯Ό ꡬ성할 수 μžˆλ‹€κ³  믿으며 μœ μ§€ 관리 μΈ‘λ©΄μ—μ„œ 더 μ’‹μ•„μ•Ό ν•©λ‹ˆλ‹€. 이 쀑 μ–΄λŠ 것도 ν…ŒμŠ€νŠΈλ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

이 tslint κ·œμΉ™μ„ μ‚¬μš©ν•˜κ³  λͺ¨λ“ˆ 해상도λ₯Ό μ œμžλ¦¬μ— μœ μ§€ν•˜λ €λŠ” μ‚¬λžŒλ“€μ—κ²Œ 이것이 μ‘°κΈˆμ΄λ‚˜λ§ˆ 도움이 되기λ₯Ό λ°”λžλ‹ˆλ‹€. ν•˜μ§€λ§Œ μ μ ˆν•œ μˆ˜μ •μ„ λŒ€μ‹ ν•  μˆ˜λŠ” μ—†μŠ΅λ‹ˆλ‹€..

λ˜ν•œ 이 λ¬Έμ œκ°€ λ°œμƒν•˜μ—¬ μˆ˜μ€‘ 음파 탐지기가 이λ₯Ό μ½”λ“œ λƒ„μƒˆλ‘œ 잘λͺ» ν‘œμ‹œν•©λ‹ˆλ‹€.

tslintλŠ” λͺ¨λ‘ typescript에 κ΄€ν•œ 것이고 κ²½λ‘œλŠ” μœ νš¨ν•œ(그리고 μ€‘μš”ν•œ) typescript 섀정이기 λ•Œλ¬Έμ— 이것이 μœ νš¨ν•œ μš”μ²­μ΄λΌκ³  μƒκ°ν•©λ‹ˆλ‹€.

λ‚΄κ°€μ΄μžˆλŠ” 경우 package.json 보닀 λ‹€λ₯Έ λ””λ ‰ν† λ¦¬μ—μ„œ tslint.json ?

- web
    - package.json
    - ClientApp
        - tslint.json

λΉ„μŠ·ν•œ 섀정을 ν•˜κ³  μžˆλŠ”λ° 이 κ·œμΉ™μœΌλ‘œ 인해 거의 λͺ¨λ“  νŒŒμΌμ—μ„œ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€. 이에 λŒ€ν•œ 해결책이 μžˆμŠ΅λ‹ˆκΉŒ?

이 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ 찾은 방법은 λ‹€μŒ ꡬ성 μ˜΅μ…˜μ„ μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

"no-implicit-dependencies": [true, ["src", "app", "~"]]

제곡된 경둜λ₯Ό ν™”μ΄νŠΈλ¦¬μŠ€νŠΈμ— μΆ”κ°€ν•©λ‹ˆλ‹€. λΆ„λͺ…νžˆ 이것은 쀑볡을 μ˜λ―Έν•˜μ§€λ§Œ μ°Ύκ³  μžˆλ‹€λ©΄ λΉ λ₯Έ μˆ˜μ •μž…λ‹ˆλ‹€.

@ 기호λ₯Ό μ‚¬μš©μž μ •μ˜ 경둜의 μ ‘λ‘μ‚¬λ‘œ μ‚¬μš©ν•˜λŠ” 우리λ₯Ό μœ„ν•΄ ν˜„μž¬ κ΅¬ν˜„μ˜ μž‘μ€ 버그λ₯Ό μˆ˜μ •ν•˜κΈ° μœ„ν•΄ PR을 μ œκΈ°ν–ˆμŠ΅λ‹ˆλ‹€. #4192

"no-implicit-dependencies": [true, ["@src", "@app", "~"]]

@ifiokjr @ λ₯Ό src λ³„μΉ­μœΌλ‘œ μ‚¬μš©ν•˜κ³  μžˆμ—ˆκΈ° λ•Œλ¬Έμ— κ°€μ Έμ˜€κΈ°κ°€ @/components 처럼 λ³΄μ˜€μŠ΅λ‹ˆλ‹€.
@ λ¨Όμ € ν™•μΈν•˜λŠ” λŒ€μ‹  @/components λ₯Ό 전체 λͺ¨λ“ˆλ‘œ κ°€μ Έμ˜€λ €κ³  ν–ˆκΈ° λ•Œλ¬Έμ— @ λ₯Ό λ¬΄μ‹œλœ 경둜둜 μ„€μ •ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

별칭을 ~ ν•˜κ³  tslintμ—μ„œ μœ„μ˜ 쀄을 μ‚¬μš©ν•˜μ—¬ 문제λ₯Ό ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€.

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