source

타이프스크립트 오류 "입력 파일을 덮어쓰게 되므로 파일을 쓸 수 없습니다..."

ittop 2023. 2. 26. 10:30
반응형

타이프스크립트 오류 "입력 파일을 덮어쓰게 되므로 파일을 쓸 수 없습니다..."

Visual Studio 2015 Update 3의 Typescript 2.2.1 프로젝트에서 다음과 같은 오류 목록에 수백 개의 오류가 표시됩니다.

'C:/{my-project}/node_modules/buffer-shims/index.js' 파일은 입력 파일을 덮어쓰므로 쓸 수 없습니다.

항상 이렇게 생겼어요.실제로 구축이 방해되는 것은 아니고, 모든 것이 정상적으로 동작하지만, 에러 리스트는 주의가 산만하고, 에러가 발생했을 때에 「실제」의 에러를 특정하기 어렵습니다.

Visual Studio 오류 목록

제 사진이 .tsconfig.json

{
  "compileOnSave": true,
  "compilerOptions": {
    "baseUrl": ".",
    "module": "commonjs",
    "noImplicitAny": true,
    "removeComments": true,
    "sourceMap": true,
    "target": "ES5",
    "forceConsistentCasingInFileNames": true,
    "strictNullChecks": true,
    "allowUnreachableCode": false,
    "allowUnusedLabels": false,
    "noFallthroughCasesInSwitch": true,
    "noImplicitReturns": true,
    "noImplicitThis": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,

    "typeRoots": [],
    "types": [] //Explicitly specify an empty array so that the TS2 @types modules are not acquired since we aren't ready for them yet.
  },
  "exclude": ["node_modules"]
}

어떻게 하면 이 모든 오류를 제거할 수 있을까요?

이 예에서는 outDir 옵션을 사용했지만 입력에서 대상 디렉토리를 제외하지 않았습니다.

// Bad
{
    "compileOnSave": true,
    "compilerOptions": {
        "outDir": "./built",
        "allowJs": true,
        "target": "es5",
        "allowUnreachableCode": false,
        "noImplicitReturns": true,
        "noImplicitAny": true,
        "typeRoots": [ "./typings" ],
        "outFile": "./built/combined.js"
    },
    "include": [
        "./**/*"
    ],
    "exclude": [
        "./plugins/**/*",
        "./typings/**/*"
    ]
}

outDir 내의 파일을 제외하기만 하면 됩니다.

// Good
{
    "compileOnSave": true,
    "compilerOptions": {
        "outDir": "./built",
        "allowJs": true,
        "target": "es5",
        "allowUnreachableCode": false,
        "noImplicitReturns": true,
        "noImplicitAny": true,
        "typeRoots": [ "./typings" ],
        "outFile": "./built/combined.js"
    },
    "include": [
        "./**/*"
    ],
    "exclude": [
        "./plugins/**/*",
        "./typings/**/*",
        "./built/**/*" // This is what fixed it!
    ]
}

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★'아까', '아까', '아까', '아까'라는 옵션의 였습니다.allowJs: true.

그래서 저는 오류를 없애기 위해 그 선을 삭제해야 했습니다.당신 코드에는 없지만, 아마 도움이 될 거예요.

가 VSCode에 을 자동 에 이 하였습니다.dist/더입니니다다

import { SomeClass } from '../../dist/xxx/someclass' 

문제를 해결하려면 가져오기를 수정하십시오.

import { SomeClass } from './someclass' 

여기에는 몇 가지 가능한 원인이 있습니다.

  • tsconfig.json:
    • ★★outDir한 수준의폴더 합니다. "dist"가 없습니다('.'.'이렇게 하다.빌드 파일이 이동하는 위치입니다.
    • ★★allowJs회선을 false 또는 삭제합니다.참고: 활성화되어 있습니다. allowJs는 선언 설정/플래그와 충돌합니다.디폴트로는 유효하게 되어 있지 않습니다.
    • "dist"( 빌드 폴더)에 " 빌드 폴더)를 포함합니다exclude.
  • :json:
    • ★★main"인덱스" 또는 기타 선택된 이름을 지정합니다."dist/index" ("dist/index") "/"는 "dist/index"입니다.
    • ★★types의 현대식 )typings)에서 "인덱스에서 "인덱스"로 이동합니다.( d . ts ) 。

수많은 다양한 방법을 사용할 수 있지만 단순성과 이해를 높이기 위해 처음에는 "dist", "simple tsconfig.json" 및 "package"를 사용하는 등 일반적인 방식을 고수하는 것이 가장 좋습니다.json 파일이 트리의 동일한 레벨에 있는 경우 등입니다.물론 node_modules의 파일을 찾아보는 것도 이해를 깊게 할 수 있지만, 인생에는 더 보람 있는 일이 있습니다.

TL;DR: 모노 레포 사용?주기 종속성을 확인하십시오!

실수로 이 패키지에 종속된 유형을 패키지에서 가져왔을 수 있습니다.

저도 이 오류가 발생했는데 다른 답변은 전혀 도움이 되지 않았습니다.특정하는 데 시간이 걸렸지만, 적어도 1시간 이상 낭비된 후에 근본적인 오류는 모노 리포에서 패키지 간의 주기적 의존성이었음이 판명되었습니다.

그래서 우리는 실 워크스페이스를 사용하고 있으며, Zilliqas와 매우 유사한 모노 레포 구조를 가지고 있습니다(당사의 레포는 아직 오픈 소스가 아니기 때문에 링크할 수 없습니다).

package A실수로 (어떻게...Import...)package Bpackage B is 에 의존하다package A- 제가 분명히 말씀드렸듯이packages/packageB/package.json:

"dependencies": {
    ...,
    "@mycompany/packageA": "^0.0.0",
    ...
}

이것은 올바른 우물입니다.그러나 불행히도 실수로 다음에서 유형을 가져올 수 있습니다.package B packages/packageA/_types.ts하지만 (의존성이 암묵적이고 바람직하지 않고 우발적이기 때문에) 명시적으로 언급하지 않았기 때문에packages/packageA/package.json아래"dependencies"컴파일러tsc)는 의존 사이클을 검출하지 못했지만 아직 구축에 실패했습니다.

네, TypeScript에 멋진 에러 메시지를 보내주셔서 감사합니다.와, 정말 많은 청어들이네요.

tsconfig.json에서 제외된 디렉토리에 'dist'를 추가하면 다음과 같이 됩니다.

{
  "exclude": ["node_modules", "dist"]
}

set Dir.

"outDir": "./",

이 힌트는 outDir를 설정하지 않으면 출력이 입력 파일 바로 옆에 배치된다는 것입니다.allowJs 후 JavaScript 파일도 컴파일됩니다.그런 다음 컴파일된 JavaScript 파일이 소스 파일을 덮어씁니다.그냥 이걸 생각나게 하는 거야

어떤 답변도 효과가 없었으므로 이 문제의 원인이 될 수 있는 내용을 공유하겠습니다.

  1. 해서 '어울리지 않다'를 해요.outDir 적어도)declarationDir부터 )까지exclude.
"exclude": ["node_modules", "types"]
  1. 의 '' ''가rootDir에는 임의의 ''가 되어 있습니다..js「」를 하지 않는 outDir 원래 javascript를이 "javascript"를 할 수 .outDir.
"outDir": "lib"
  1. ★★★★★★★★★★★★★★★★★★★★★★타입 스크립트가 컴파일 하는 임의의 장소에서 Import 하는 경우는, 그 타입 선언을 체크해 생성해 주세요.하지 않습니다.include ★★★★★★★★★★★★★★★★★」exclude rootDir를 Import 했을 경우, 사용, 입력, 덮어쓰기, 출력으로 설정되어 있습니다.또, 그 이전의 설정은 존중되지 않습니다.

예를 들어 다음과 같습니다.

- /src
- tsconfig.json
- randomJsFile.js

포함:

"rootDir": "src"

그리고:

"include": ["src/**/*.ts"]

다음에 '가져오다'를 .randomJSfile.js의 임의의 에 있는 /src " " " " " " " " " " 가 됩니다.*.d.ts파일 바로 옆에 있는 파일(유형 디렉토리에 출력하지 않음)이 있으면 해당 파일이 덮어쓰게 됩니다.

, Import, Import .rootDir( node _ model " ) 。

.import config from ../webpack.config.js ★★★*.d.ts for webpack (하지 않고 되어 있는 breaktypes webpack (types "는 tsconfig "는 "tsconfig "는 "로 설정되어 있습니다)도 Import를 시도합니다.설정을 Import 했을 때, 왜 완전히 랜덤한 Web 팩 타입이 디렉토리에 표시되기 시작했는지 계속 궁금했습니다.

증분 빌드가 활성화되어 있고 일부 시간만 중단되는 경우(또는 이러한 유형을 삭제한 후 (현재로서는) 그대로 남아 있는 것처럼 보이는 경우) 이 기능은 훨씬 더 재미있습니다.

컴파일러에 "outDir" 추가: ".dist" 이 오류가 발생했을 때 tsconfig.json의 옵션이 기능했습니다.이 에러는 Visual Studio Code TypeScript 확장자에서만 출력됩니다.tsc 컴파일러가 아닌 webpack과 함께 ts-loader를 사용하기 때문에 outDir를 지정할 필요가 없었습니다.webpack 설정이 이를 제어하기 때문에 VS 코드 확장이 만족스러우면 좋습니다.

제 경우 실수로 dist directory의 클래스를 포함시켰기 때문입니다.

import {Entities} from "../../dist";

방금 이 선을 제거했고 이제 모든 것이 정상입니다.

틀렸다, , 틀렸다, 틀렸다, 틀렸다.Cannot write file 'xx\xxx.js' because it would overwrite input file.

다음과 같은 것을 알 수 있습니다.

ifoutDir지정되지 않았습니다. .ts 파일은 생성된 .ts 파일과 동일한 디렉토리로 출력됩니다.

예기치 않게 소스 파일을 덮어쓰지 않도록 컴파일러에 이 오류가 표시됩니다.

하다, 하다, 하다, 하다를 .outDir "set "set "set" 입니다.noEmit: trueJavaScript 소스 코드와 같은 컴파일러 출력 파일을 내보내지 않도록 합니다.

아마도 문제의 근원은 같은 모듈을 생성하는 2개의 파일일 것입니다.같은 폴더에 같은 이름의 확장자가 다른2 개의 파일이 있는 경우, 이 에러가 발생합니다.

예:

\index.ts
\index.tsx

솔루션은 이러한 파일 이름 중 하나를 다른 이름으로 변경합니다.

이 문제에는 다양한 이유가 있을 수 있기 때문입니다!에러를 만났을 때의 경험을 공유하겠습니다!

이야기

★★★★★★★★★★★★★★★★★★★★★!두 개 요! 는요!src/index.tssrc/test/logToFile.directTest.ts.

src/test/logToFile.directTest.ts문제를 해결했다!각 해상도가 같은 파일에 쓰려고 했던 것 같습니다!

선언을 위한 설정은 다음과 같습니다.

{
  "compilerOptions": {
    "declaration": true,
    "declarationDir": "./dist",
    "module": "commonjs",
    "noImplicitAny": true,
    "lib": ["ESNext", "DOM"],
    "outDir": "./dist",
    "target": "es6",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "esModuleInterop": true
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules", "dist"]
}

그리고 모든 것이 올바르게 설정되었습니다!제가 제외된 것을 알 수 있습니다.dist디렉토리로 이동합니다.그리고 올바르게 설정한다.outDir필수 항목입니다(그렇지 않으면 오류가 발생할 수 있습니다).그리고 다른 답변은 모두 그 점을 언급하고 있습니다).

다른 저장소 및 패키지와 함께 구성을 사용하고 있는 것 이상입니다.그리고 난 아무 문제 없어!

마지막에는 이렇게 했어요.

import { Logger } from '../..';

내 수입이 틀렸어!

다음과 같이 해야 합니다.

import { Logger } from '..';

모듈을 자체 저장소로 이식하는 동안 Import를 변경하는 것을 잊었습니다!

그리고 내가 파일을 다시 첨부했어!그리고 테스트도 잘 되었고 모두 잘 작동했습니다!

그리고 그 이야기의 혜택을 얻기 위해서!

모든 합리적인 솔루션(또는 해야 할 일)이 존중되어도 문제가 해결되지 않는 경우!ts 파일 내에서 Import를 확인합니다!

Import는 루트(예를 들어)를 참조하고 자동으로 dist로 리다이렉트할 수 있습니다.그래서 .d.ts 파일!일반적으로 타이프 스크립트는 오류를 발생시킵니다!디렉토리 폴더에서는 눈에 띄기 때문에!하지만 그러지 않았어!그리고 그 실수를 저질렀어!

그리고 더 많은 이점을 가져다 주기 위해

오류 설명

간단히 말하면, 다음과 같습니다.

https://github.com/microsoft/TypeScript/issues/6046#issuecomment-210186647

즉, 입력 파일은 명령줄에서 전달되는 파일이거나 명령줄에서 전달되는 파일 중 하나에 종속된 파일입니다.

두 개가 같은 신고 파일에 매핑되면!그리고 그것은 그들이 같은 이름을 공유했을 때 일어날 수 있어요!아니면 신고서 파일 자체를 참조하세요!파일에서 가져왔습니다!잘못된 수입으로 (내 경우처럼)!아니면 그 디스트도 무시당하지 않아!

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★!「 」를 dist 및 셋업을 합니다.outDir

이 명령어를 사용하여 입력 파일을 확인할 수 있다는 것은 매우 흥미롭습니다.

tsc --listFiles

문제가 있는 경우는, 리스트내에 선언 파일이 있습니다.

다양한 패키지가 다른 TypeScript 패키지에 대한 참조에 의존하는 꽤 큰 모노레포를 개발하는 동안 이러한 오류가 발생했습니다.을 주지 입니다만, 「VS 에는, 「 Code」vs 「Code」를 때, .tsconfig.jsonfilename을 클릭합니다.

위의 답변 중 일부는 오류 수를 줄이는 데 도움이 되었지만 VS Code TypeScript 서버를 재시작할 때까지 모든 오류가 마법처럼 사라졌습니다.

VS 코드:

Shift + + - Mac에서 명령 팔레트를 엽니다."TypeScript"를 입력하고 "TypeScript:TS 서버를 재기동합니다.누르다

운이 좋으면 수정 오류는 마법처럼 사라집니다.

저도 같은 문제가 있었어요.제 경우 이름이 같은 파일이 1개 모듈에 2개 있기 때문에 발생합니다.index.ts index.tsx.

그 중 하나의 이름을 바꾸었더니 문제가 해결되었습니다.

저도 같은 문제에 직면했고, 위의 해결책을 시도했습니다.난 아무도 안 통했어그런 다음 빌드 폴더를 삭제했습니다.lib와 build cmd를 다시 실행해 주세요.

tsc --build --explainFilesd.ts에 되어 있는지 합니다.

예.

dist/index.d.ts
  Imported via '..' from file 'mocks/mock-requests.ts'

는 제가 안 .'..'

https://www.typescriptlang.org/tsconfig#explainFiles 를 참조해 주세요.

도 같은 그 는 ★★★★★★★★★★★★★★★★★★★★★ 입니다.exclude 」를 지정했을 는, 「 」를 지정합니다.exclude옵션에서는 출력 디렉토리도 추가해야 합니다.

는 이런 있었다."exclude": ["resources/js/**/*", "node_modules"] 디렉토리는 「Directory 」로 설정되어 있습니다.outDir:"./build".

" " " build되었습니다.

exclude:["resources/js/**/*", "node_modules", "build"]

대부분의 경우 이 문제는 노드 2개로 하나의 프로젝트를 실행하려고 할 때 발생합니다.이 가설의 경우 런 빌드 후 "노드"라는 이름의 프로세스 수를 컴퓨터에서 검정할 수 있습니다.문제를 해결하기 위해 내가 한 일:

스텝 1

비교하다

node -v

그리고.

nvm -ls

, 사용중인 버전.터미널 설정에서 현재 노드 버전:

nvm use {neededVersion}

원칙적으로 nvm에서 불필요한 노드 버전을 삭제합니다(IDE가 노드의 일반 버전을 자동으로 결정하는 데 도움이 됩니다).

스텝 2

IDE 내의 현재 노드를 확인합니다.즉, WebStorm: Prefeakes -> Language & Frameworks -> Node.js 및 NPM | Typescript:노드 인터프리터 - 필요한 버전을 설정합니다.

Typescript 2.3.x로 업데이트하여 문제가 해결된 것 같습니다.

또한 Visual Studio 2017을 사용하는 것도 큰 발전이었다.두 가지 업데이트를 모두 수행하는 것이 좋습니다.

"declaration": true filetsconfig.json에서 .지금은 신고서가 없어서 도움이 안 됐지만요.

에는 방금 요."module": "commonjs"로로 합니다."module": "esnext"그걸 고쳤죠

lerna 패키지 프로젝트 또는 모노레포 프로젝트에서는 다음과 같이 동작할 수 있습니다.


첫 번째, 당신의 프로젝트는 다음과 같습니다.

packages\
  core\
    tsconfig.json
    package.json 
  common\
    tsconfig.json
    package.json
  tsconfig.base.json

당신의 소포.json

  ...
  "main": "./lib/index.js",
  "types": "./lib/index.d.ts",
  "files": [
    "lib"
  ],
  ...

사용하시는 tsconfig.json

{
  "extends": "../tsconfig.base.json",
  "compilerOptions": {
    "outDir": "./lib",
  },
}

어떤 방법으로 변경하더라도tsconfig.json not work(하지 않음)


이것이 저의 해결책입니다.

를 삭제하다outDir:"lib" first를 사용합니다.rd lib /s /q및를 실행합니다.tsc 될 거야, 잘 될 거예요.

큰 코드 또는 모노레포 내에서 작업하는 경우 편집기를 재시작하는 것만으로 충분하거나 vscode를 사용하여 타이프스크립트 언어 서버를 재시작하는 것으로 충분할 수 있습니다.

GitHub 문제에서 제시된 바와 같이 문제를 이해하는 가장 좋은 옵션은 traceResolution 플래그를 사용하여 tsc 명령을 실행하는 것입니다.

tsc --traceResolution

저 같은 경우에는 라이브러리와 앱을 동시에 개발해서...

라이브러리에서 가져온 파일을 앱에서 라이브러리로 이동하면 라이브러리에 있는 파일이 자신의 dist 폴더에서 파일을 가져옵니다.

웃긴 건...사실 리팩터링이 최고조에 달하고 있어요파일에 대한 올바른 참조가 유지되었습니다. : )

이 설정은 나에게 유효하다

"allowJs": true

allowJs다른 답변의 옵션에서는 아마도 내 구성이 프로젝트에서 JavaScript 파일을 허용하지 않을 것이라는 생각이 들었습니다.

다 게 다 하는 거예요.outDir여기서 사람들이 추천하는 그런 거로 이름을 바꾸면 끝이에요.

물론 보일러 플레이트 프로젝트였고 이 파일은 (TypeScript) 프로젝트 전체에서 유일한 JavaScript 파일이었습니다.

설정하다allowJS: true되어 있지 않다outDir : true 일, 일, 일, 일, 일, 일.

언급URL : https://stackoverflow.com/questions/42609768/typescript-error-cannot-write-file-because-it-would-overwrite-input-file

반응형