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
μ μλ κ²μΌλ‘ ν΄κ²°λμ§ μμΌλ©΄ μ΄ κ·μΉμ μ΄λ₯Ό 무μν΄μΌ νλ€κ³ μκ°ν©λλ€.
κ°μ Έμ€κΈ°κ° 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μμ μμ μ€μ μ¬μ©νμ¬ λ¬Έμ λ₯Ό ν΄κ²°νμ΅λλ€.
κ°μ₯ μ μ©ν λκΈ
μ΄ κ·μΉμ μ체 μμ€ μ½λμ λ³μΉμ μ¬μ©ν λ μλνμ§ μμ΅λλ€(npm ν¨ν€μ§μμ κ°μ Έμ€μ§ μμ). μλ κ²½λ‘ λμ μ λ κ²½λ‘λ₯Ό μ¬μ©νλ κ²μ΄ λ§€μ° μ μ©ν©λλ€.
tsconfig.jsonμμ κ°λ μ ν리μΌμ΄μ μ κ²½μ° λ€μμ μΆκ°νκΈ°λ§ νλ©΄ λ©λλ€.
κ·Έλ° λ€μ λ€μκ³Ό κ°μ κ°μ Έμ€κΈ°λ₯Ό μνν μ μμ΅λλ€.
μ΄ κ²½μ°λ₯Ό ν΄κ²°νκΈ° μν΄ μ΄ λ¬Έμ λ₯Ό λ€μ μ΄μ΄μΌ ν μλ μμ΅λλ€(node_modulesλ νμνμ§ μμΌλ©° tsconfig.json νμΌλ§ μμΌλ©΄ λ¨).
λλ μ΄ κ·μΉμ κ°μ¬νκΈ° λλ¬Έμ κ·Έκ²μ λΉνμ±ννλ κ²μ λΆνν μΌμ λλ€.