Typescript: 错误“无法写入文件......因为它会覆盖输入文件。”

创建于 2017-03-08  ·  99评论  ·  资料来源: microsoft/TypeScript

打字稿版本: 2.2.1

使用Visual Studio 2015 Update 3 时,我在错误列表中收到数百个错误,例如:

无法写入文件 'C:/{{my-project}}/node_modules/buffer-shims/index.js' 因为它会覆盖输入文件。

它看起来总是这样。 它实际上并没有阻止构建,并且一切正常,但是错误列表会分散注意力,并且在发生错误时很难找到“真正的”错误。

Visual Studio Error List

我的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 <strong i="17">@types</strong> modules are not acquired since we aren't ready for them yet.
  },
  "exclude": ["node_modules"]
}

我怎样才能摆脱所有这些错误?

_(我也在StackOverflow

Needs More Info

最有用的评论

我找到了适合我的解决方法。 在我的例子中,我使用了outDirrootDir而不指定files数组。 将outDir的路径添加到exclude数组时,一切似乎都正常工作。

{
    "compilerOptions": {
        ...,
        "outDir": "./dist",
        "rootDir": "./src",
    },
    "exclude": [
        "node_modules",
        "dist" <-- I had to add this to fix the errors
    ]
}

也许 TypeScript 也在监视dist文件夹的内容,即使它被设置为outDir

所有99条评论

我也遇到同样的问题。

--allowjs设置了吗? 可以分享项目吗?

抱歉,我无法共享该项目,也没有未设置该标志。 我的tsconfig.json在上面,我们只是将它与 VS2015 Update 3 一起使用,它只会正常触发 MSBuild 的构建。

我有队友抱怨他们在同一个项目中遇到了同样的问题。 我还在家里的另一台计算机上从事一个项目,该项目具有完全相同的问题和相同的设置(TS 2.2.1、VS2015 U3 等)

如果您创建一个具有相同配置的基本项目,您是否看到相同的行为?

我们有同样的问题https://github.com/wc-catalogue/blaze-elements/issues/299尽管类型定义写访问

@Hotell你看到这个没有“awesome-typescript-loader”吗? 你能和我分享重现步骤吗?

是的,正如您在问题中看到的,输出来自第二次运行原始tsc

screen shot 2017-03-10 at 5 08 04 pm

只需克隆 repo https://github.com/wc-catalogue/blaze-elements

  • 从根点击yarn
  • 点击yarn tsc -> 第一次编译(一切正常)=> 第一次生成definitions/文件夹
  • 再次击中yarn tsc -> 错误

我们遇到了类似的问题——打字稿(2.2.1)和 Visual Studio 2015(更新 3)的相同版本; 第一次构建运行时,错误为零,但之后我们会收到数百个这样的错误。

似乎所有错误(对我们而言)都在“node_modules”文件夹中,我们已将其设置为在 tsconfig.json 文件中排除。 -- 从查看类似的错误来看,在这个版本的打字稿中,排除项似乎没有得到相同的对待?

我们的 tsconfig.json 文件:

{
  "compilerOptions": {
    "noImplicitAny": false,
    "noEmitOnError": true,
    "removeComments": false,
    "sourceMap": true,
    "target": "es5",
    "module": "commonjs",
    "moduleResolution": "node",
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true
  },
  "exclude": [
    "node_modules",
    "wwwroot",
    "aot",
    "AngularApp/main-aot.ts"

  ],
  "compileOnSave": true
}

我们得到的一些错误(它们都是相同的,但文件不同):

Severity    Code    Description Project File    Line    Suppression State
Error   TS5055  Cannot write file 'C:/XYZ/Project.AppWeb/node_modules/zone.js/dist/zone.js' because it would overwrite input file.  TypeScript Virtual Projects     1   Active
Error   TS5055  Cannot write file 'C:/XYZ/Project.AppWeb/node_modules/events/events.js' because it would overwrite input file.  TypeScript Virtual Projects     1   Active
Error   TS5055  Cannot write file 'C:/XYZ/Project.AppWeb/node_modules/core-js/modules/_wks.js' because it would overwrite input file.   TypeScript Virtual Projects     1   Active
Error   TS5055  Cannot write file 'C:/XYZ/Project.AppWeb/node_modules/core-js/modules/_uid.js' because it would overwrite input file.   TypeScript Virtual Projects     1   Active
Error   TS5055  Cannot write file 'C:/XYZ/Project.AppWeb/node_modules/core-js/modules/_to-primitive.js' because it would overwrite input file.  TypeScript Virtual Projects     1   Active

同样,如果我们删除“node_modules”文件夹,构建将运行一次,但是一旦重新创建,它将在下一次重建时失败。

@Hotell我在本地看不到这个,我错过了什么?

c:\test\14538\blaze-elements>yarn tsc
yarn tsc v0.18.1
$ "c:\test\14538\blaze-elements\node_modules\.bin\tsc"
Done in 5.46s.

c:\test\14538\blaze-elements>yarn tsc
yarn tsc v0.18.1
$ "c:\test\14538\blaze-elements\node_modules\.bin\tsc"
Done in 5.87s.

c:\test\14538\blaze-elements>dir /B definitions
packages
polyfills.d.ts
styles.d.ts
test-helpers.d.ts
vendors.d.ts

c:\test\14538\blaze-elements>yarn tsc
yarn tsc v0.18.1
$ "c:\test\14538\blaze-elements\node_modules\.bin\tsc"
Done in 4.48s.

@BrainSlugs83如果你有一个复制项目,我很想看看。

我也面临同样的问题,这些是错误:
screen shot 2017-03-16 at 23 34 13
这是我的 tsconfig.json:
screen shot 2017-03-16 at 23 34 25

由于我根本没有使用打字稿,我只是创建了 tsconfig 来跳过构建,因此我还必须选择 target=ES6 否则我会遇到其他错误。

tsconfig.json 是您项目的一部分吗? 你能确认内容类型是“内容”吗? 如果是这样,你能分享你的项目吗?

@mhegazy嗨,是的,我可以确认 tsconfig.json 包含在项目中:

screen shot 2017-03-17 at 19 53 12

但很抱歉我不知道你指的是什么“内容类型”,你能澄清一下吗?

我无法共享该项目。

在我的项目中,我也可以确认tsconfig文件包含在项目文件中,并且列为内容。

@max-favilli 我认为@mhegazy在谈论“内容类型”时的意思是“构建操作”。

在解决方案资源管理器中选择 tsconfig.json。 调出“属性”窗口(默认为 F4 键)。 将有一个 Build Action 属性。

谢谢@kevindqc@mhegazy是的“构建操作”设置为“内容”
screen shot 2017-03-18 at 11 21 28

您能否与我分享您的虚拟项目结构,以便您需要:

  • 转到Tools > Options > Text Editor > TypeScript > Project ,并检查Display Virtual Projects when no Solution is loaded
  • 重新启动VS,并在您的项目中打开一个文件
  • 您现在应该在解决方案资源管理器中看到一个名为TypeScript Virtual Project的新节点

@mhegazy像这样吗?

screen shot 2017-03-21 at 02 08 13

谢谢你的帮助。

我也有同样的问题。 我也不能分享这个项目,但我会尽量提供尽可能多的信息。

我在 .csproj ( <TypeScriptCompileBlocked>true</TypeScriptCompileBlocked> ) 中禁用了打字稿编译
相反,它是由npm run build:prod编译的,它在构建事件中。

错误并不总是存在。 我一直试图让它们出现(在VS中显示,所以我重新启动了VS)。 我试过构建打字稿项目、构建解决方案、运行测试、运行代码分析、运行代码覆盖率等。没有任何东西触发它。 然后,就在我写最后一句话的时候,错误出现了。 所以它似乎是一些后台任务吗? 它似乎在我开始构建后大约 2 分钟发生(至少我尝试了 2-3 次)

时间线:
1:37:20 - 打开 Visual Studio
1:37:30 - 开始构建解决方案
1:38:20 - 构建完成
1:39:39 - 出现错误

我注意到我的项目仍在使用 v2.0.3 Microsoft.TypeScript.CompilerMicrosoft.TypeScript.MSBuild nuget 包。 我将它们更新到 v2.2.1。 到目前为止,没有错误。 如果我再次看到错误会更新。 (编辑:我再次看到错误,虽然它花了更长的时间,大约 5 分钟,当我打开 VS 时,除了构建之外我什么都不做。实际上,我什至不需要构建任何东西来获取错误 - 只需打开项目并等待几分钟显示错误)

关于那些过时的nuget包,这正常吗? 我想当我安装新版本的打字稿时,我有一个弹出窗口来升级我的项目打字稿工具,但它似乎只更新了<TypeScriptToolsVersion>2.2</TypeScriptToolsVersion> 。 它不应该也更新 nuget 包吗?

我刚刚更新到 Typescript 2.2.1 并遇到了同样的问题。 它标记了所有 node_modules 但 tsc 编译器完成没有问题。

@mhegazy

@Hotell我在本地看不到这个,我错过了什么?

对,它是由https://github.com/wc-catalogue/blaze-elements/commit/cdb94bf8feb3a1ad7e21e6fce243e3322c1334cc修复的

sry 延迟回答和 thx 4 帮助!

@Hotell @mhegazy似乎对我不起作用。
如果您在“定义”文件夹中有 d.ts 文件,它可能会起作用吗?
但我没有那个。 我在“node_modules”下有@types ,应该继承排除吗?

@chrismbarr请问你解决了吗? 我一直在关注这个线程,甚至做了@Hotell几个帖子建议的修复,但我仍然在 Visual Studios 中遇到这些错误。 它们似乎都来自 node_modules 文件夹。

您能否启用详细日志记录并将结果发送给我们? 将系统环境变量TSS_LOG设置为-file C:/temp/logs/tsserver.log -level verbose等值(确保日志文件夹存在)。 然后在重现问题后,发送/附上日志以进行分析。 (注意:它可能包含文件路径和完成列表等数据,因此请确保其中没有您不想共享的任何数据)。

在我的测试中,我偶尔会看到项目系统构建了一个包含错误文件的项目视图,导致在不可预测的时间出现间歇性错误。 我想看看这是否可能是这里的原因。

如果您更愿意直接发送文件而不是上传文件,我可以提供我的电子邮件地址(Microsoft dot com 上的 Billti)。 谢谢。

@johnlee不,在 VS2015 中仍然相同。 但是,从那以后我开始使用 Visual Studio 2017 并且我在那里没有错误!

添加了@billti变量,重新启动了 Visual Studio (2017),重建了解决方案,但未创建日志文件。 我应该检查什么?

它绝对是系统环境变量吗(即,如果您打开一个新的命令提示符并运行SET TSS是否列出了设置)? 如果不是,日志要写入的文件夹是否已经存在(记录器不会创建不存在的目录)。 除此之外,在路径中使用正斜杠而不是反斜杠也更安全。

typescripterrors
:(

@billti好的,我刚刚检查了一下,日志文件现在就在那里。 请在附件中找到它们
tss-log.zip

谢谢。 我查看了该日志,我没有看到其中的任何调用报告了该错误。 错误是否确实发生在此日志涵盖的时间范围内?

@billti是的,错误一直在发生:
screen shot 2017-04-11 at 01 25 24

他们只是永久地存在。 并在每次构建时刷新。

所有这些错误都与不正确的变量声明有关(我们已经为即将发布的版本修复了一个单独的问题)。 根据上面的标题和屏幕截图,此问题约为Cannot write file... 。 你没有Cannot write file...问题吗?

@billti在发布我之前的消息(我把它留在那里是为了证明我的愚蠢)后,我意识到这些错误是不同的。 我只能猜测我几天前安装的 Visual Studio 更新解决了原来的问题。 但我不确定。
我从上一条消息中消除了这些错误,只是从@types 中删除了类型。
非常感谢。

@billti我正在尝试向您发送一些日志,但没有创建。 我已经在我的系统(不是用户)变量中将TSS_LOG-file C:/temp/logs/tsserver.log -level verbose

C:\temp\logs存在,我完全控制了Everyone

如果我重新启动我的 VS2015,即使在我收到所有Cannot write file...错误之后,也不会在C:\temp\logs内创建任何内容。 如果我尝试在新的命令提示符中输入node node_modules\typescript\lib\tsserver.js (并立即输入 CTRL+C),我会得到两个日志文件。

抱歉@kevindqc ,我没有意识到您在使用 VS 2015。该日志记录仅适用于 VS 2017(现在在语言服务进程外使用 tsserver.js)。

回头看看你的问题 - 如果你看到错误列表随机改变,我相信这是同一个问题@zhengbli刚刚在https://github.com/Microsoft/TypeScript/pull/15080 中修复。

@billti np. 我认为这个问题只发生在 VS2015 上,不是吗? 使用 VS2017 时遇到问题的唯一用户遇到了与打字相关的不同错误。 有人从 VS2015 切换到 VS2017 说问题消失了。

此外,错误列表不会随机更改 - 它会在随机时间填充一次,包含所有与此问题相关的“无法写入 ..”错误。 你确定#15080 修复了吗? 除了您昨天提到的这个问题之外,我对这个问题一无所知? 我该如何测试? 我看到有一个 2.3 RC,但它是 9 天前发布的,而修复程序是在 2 天前合并的:(

我还注意到,即使在我关闭解决方案后,这些错误仍保留在我的错误列表中。

发布他的打字稿虚拟项目的人也有不同的错误,所以我想这没有帮助。 这是我的:
image

node_modules应该在那里吗? 它在我的 tsconfig 中排除。 它不包含我的物理 node_modules 文件夹中的所有内容(我的 node_modules 文件夹中的 14 个子文件夹与 854 个子文件夹)

{
  "compilerOptions": {
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "module": "commonjs",
    "moduleResolution": "node",
    "noImplicitAny": true,
    "removeComments": false,
    "sourceMap": true,
    "suppressImplicitAnyIndexErrors": true,
    "target": "es5",
    "baseUrl": "./src",
    "skipLibCheck": true,
    "paths": {
    },
    "typeRoots": [
      "node_modules/@types"
    ]
  },
  "exclude": [
    "node_modules",
    "dist",
    "typings"
  ],
  "types": [
    "core-js",
    "jasmine",
    "lodash",
    "node",
    "webpack"
  ],
  "awesomeTypescriptLoaderOptions": {
    "forkChecker": true,
    "useWebpackText": true
  }
}

升级到 TS2.3 工具后到目前为止还没有出现错误。 谢谢!
编辑:没有。 毕竟错误仍然存​​在,只是出现的时间更长。

看来,这个问题与有关这个问题。 重现的示例解决方案 - 已上传。

我找到了适合我的解决方法。 在我的例子中,我使用了outDirrootDir而不指定files数组。 将outDir的路径添加到exclude数组时,一切似乎都正常工作。

{
    "compilerOptions": {
        ...,
        "outDir": "./dist",
        "rootDir": "./src",
    },
    "exclude": [
        "node_modules",
        "dist" <-- I had to add this to fix the errors
    ]
}

也许 TypeScript 也在监视dist文件夹的内容,即使它被设置为outDir

如果您的项目根目录下有outDir ,并且您只是在根目录下包含所有内容,那么这将是意料之中的。 通常,您希望将构建输出放在项目源文件夹之外的其他地方。

看起来以上所有问题都在此线程或链接问题中得到解决。 如果情况不是这样,请告诉我,我会重新打开。 谢谢!

@billti我假设您的评论是对我之前评论的回应? 如果是这样,感谢您的澄清。 这让我现在更清楚这件事,因为我假设在指定rootDir ,编译器只会监视该特定文件夹并排除其他所有内容。 但目前的行为是有道理的。

最好的解决方案是来自Borislemke
{ "compilerOptions": { ..., "outDir": "./dist", "rootDir": "./src", }, "exclude": [ "node_modules", "dist" <-- I had to add this to fix the errors ] }

我遇到了同样的问题,发现我的一个导入错误地引用了我的 dist 文件夹 EG 中的类
从“../../dist/ClassName”导入{ClassName};

由于导入类在同一个文件夹中,我将其更改为:
从“./ClassName”导入{ClassName};

一切都在重新编译:)

我们的应用程序中有一个预定义的“dist”文件夹。 删除它为我修复了它。

我认为这是底层问题(最后一个 Windows 创意者更新):
visual-studio-2015-deletes-file-on-save-cordova-solution

只需将您的“dist”文件夹添加到 tsconfig.json 的排除列表中
前任:
“排除”:[“node_modules”,“dist”]

我通过添加一个包含部分来纠正这个问题:

"include": [ "*.ts", ], "exclude": [ "node_modules" ]

在使用我的源目录下的outDir ,我也遇到了这个问题。

默认情况下,打字稿编译器怎么不知道它不应该尝试编译outDir ? 这似乎很奇怪。 将 outdir 添加到排除列表确实修复了它。

我对 netbeans 有这个问题,哈哈 👎

当我有两个文件foo.tsfoo.tsx ,我也遇到了这个错误,这两个文件显然都会编译为foo.js

  "compilerOptions": {
    "noEmit": true 
  }

为我修好了。

如果您确实希望生成要分析的*.js文件,则noEmit是更好的解决方案。 毕竟,它们不一定是用tsc生成的。

在我的情况下,Ream.js 生成.ream/**.js然后我在我的代码中使用import XXX from '#out/yyy'导入它(它有效,但在 VS Code 中生成警告“无法写入文件...”)。

基本上,拥有"noEmit": false的唯一原因是当您使用原始tsc 。 对于所有其他环境( ts-node / ts-node-dev ,webpack,rollup)启用它更安全。

@uglycoyote一样,对我outdir到 excludes 数组中。 其他建议都没有奏效。

我觉得这个问题与这些有关:

这个问题发生在我身上,因为我在tsconfig.json设置了"declaration": true ,所以它对 build 文件夹中的d.ts文件感到愤怒,即使该目录在根。 我可以做一个没有问题的新构建,但之后的任何构建都会抛出: Cannot write file ... because it would overwrite input file. 。 从我在其他故事中看到的情况来看,这曾经在另一个版本中起作用,然后一定发生了一些变化。

就像我解决了test.ts文件在rootDir我必须将以下内容添加到tsconfig.json

"exclude:" [ "./build" ]

这也可能发生在配置继承中。 每个配置都需要单独指定outDir 。 似乎outDir中的路径是按绝对值解析的。 从用户的角度来看,甚至可能是一个错误。

{
  "extends": "../../base/tsconfig.json",
  "compilerOptions": {
    "outDir": "myOutDir"  // <--- Don't forget this
  }
}

如果您在package.json内对“outDir”有错误的引用,也值得检查

"main": "lib/index.js",
  "typings": "lib/__types__",      <-------
  "devDependencies": {
    "@types/lodash.mapvalues": "^4.6.4",
    "@types/node": "^10.12.18",
    "@types/winston": "^2.4.4"
  }

我在一个有项目参考的项目中经历了这一点。 排除项都不重要,@elmpp 暗示的typings条目做了什么。

所以这将在项目引用 monorepo 中产生TS5055: Cannot write file because it would overwrite input file

  "main": "lib/cjs/index.js",
  "module": "lib/esm/index.js",
  "typings": "lib/cjs/index.ts",

但这不会报告任何错误:

  "main": "lib/cjs/index.js",
  "module": "lib/esm/index.js",
  "typings": "src/index.ts",

所以显然我要么需要操作这个预发布,要么在包中发布 src。

环境:

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

为我修好了(我的outputDirdist )。

如果默认情况下为tsc --watch排除输出目录,那可能会很棒。

为了将来参考,如果您从其内部导入模块,就会发生这种情况。

所以在mymodule里面做import x from 'mymodule mymodule会触发这个。 它非常神秘,可能应该修复!

类似地,如果你有一个index.ts和一堆像export * from './foo'这样的行,我就会遇到这个问题,并且在其中一个文件中,我用import foo from '.'而不是import foo from './foo'导入

在过去的两天里,我一直在思考这个问题,直到我删除了index.ts并且出现了导入错误。 这是非常不明显的。

所以我认为问题是因为我在同一个 repo 中有 2 个 ts 项目。 ( Angular & Nestjs ) ,级别 1 文件夹的 tsconfig.json 抛出此错误。 我通过放置 exclude "public" 来修复,在公共场合是我的 Angular 代码和它自己的 tsconfig.json。

我遇到了这个问题,因为我不确定为什么ts-node不起作用然后我tsc检查问题是否是 TypeScript。 由于tsc ,我现在有几十个.js文件与ts并排,我可以通过运行git status来确认

image

解决方案是git clean -f

就我而言,VS Code 似乎从dist文件夹而不是src文件夹中自动导入了一个文件。 修复解决了问题。

这真的不应该关闭,打字稿应该打印一个错误告诉你发生了什么。 目前几乎不可能弄清楚。 我不确定是什么原因导致它时常发生,VSCode 可能会意外更新 tsconfig.json 引用,但它会减慢一切,并且每次调试都非常重要。

在 Vue 项目的根目录中,这对我有用:

// tsconfig.json
{
    "include": ["./src/**/*"],
    "exclude": ["node_modules", "dist", "public"],
    "compilerOptions": {
      "module": "es2015",
      "outDir": "",
      "moduleResolution": "node",
      "target": "es5",
      "allowJs": true,
      "checkJs": true, // Type checking
    }
}

在我添加之后
"outDir": "",
问题消失了。

我的目标只是让 ts 智能在 .js/vue 文件中工作。

有同样的错误信息。 问题是我在同一个文件夹中有两个名称相同但扩展名不同的文件,因此删除带有.js扩展名的文件可以解决这个问题。

有同样的错误信息。 问题是我在同一个文件夹中有两个名称相同但扩展名不同的文件,因此删除带有.js扩展名的文件可以解决这个问题。

是的,我有同样的问题。 我重命名了一个.tsx文件.ts VS-Code 有用地重新创建,导致了这个问题。

不知道如何正确解决这个问题,但就我而言,我刚刚从 tsconfig.json 中删除了"declaration": true 。 不生成 D.ts 文件,但无论如何我不需要它们。

对于任何通过谷歌搜索类似的错误消息来到这里的人,让我分享我的发现:

  1. 正如你所读到的,这个错误是因为 TypeScript 编译器试图将一个 .js 文件编译到相同的路径中。
  2. 很可能您根本不想编译 .js 文件。 如果可能,请从您的 tsconfig.json 或 CLI 选项中删除allowJs: true--allow-js
  3. 如果您确实需要它们,那么您可能希望从编译中排除错误消息中提到的文件。 该线程中的一些人通过添加exclude: ...来做到这一点(可能没有注意到)。

    • 注意不要在compilerOptions添加“排除”。

希望有帮助🙏

我需要手动排除我的构建lib/目录

某处似乎存在一个错误,导致某些选项不兼容。 我发现使用
allowJS true +
rootDir + outDir :好的
rootDir + outFile : NOK : rootDir不考虑:目录和子目录中的所有文件都被设置为编译并可能被覆盖。
禁止其他一些选项组合。

"allowJs": true
"noEmit": true
为我工作。

在 Vue 项目的根目录中,这对我有用:

// tsconfig.json
{
    "include": ["./src/**/*"],
    "exclude": ["node_modules", "dist", "public"],
    "compilerOptions": {
      "module": "es2015",
      "outDir": "",
      "moduleResolution": "node",
      "target": "es5",
      "allowJs": true,
      "checkJs": true, // Type checking
    }
}

在我添加之后
"outDir": "",
问题消失了。

我的目标只是让 ts 智能在 .js/vue 文件中工作。

谢谢,它对我有用。

如果您仅使用 TS 进行类型检查(无编译),并且在.js文件中需要它,请使用@guaizi149解决方案:

"compilerOptions": {
  "allowJS": true,
  "noEmit": true
}

这将告诉 TS 它不应该担心编译,因此不会覆盖任何文件并且不会触发警告。 这是使用outDir: ""的更好解决方案。

这也可能发生在配置继承中。 每个配置都需要单独指定outDir 。 似乎outDir中的路径是按绝对值解析的。 从用户的角度来看,甚至可能是一个错误。

{
  "extends": "../../base/tsconfig.json",
  "compilerOptions": {
    "outDir": "myOutDir"  // <--- Don't forget this
  }
}

这个解决方案对我来说就像一个魅力! 我的tsconfig.json现在看起来像这样:

{
  "compilerOptions": {
    "allowJs": true,
    "baseUrl": "../node_modules",
    "types": ["cypress"],
    "outDir": "myOutDir"
  },
  "include": ["**/*.*"]
}

"allowJs": true
"noEmit": true
为我工作。

谢谢@guaizi149 ,您的解决方案对我有用👍

已解决 - 已在我的 tsc 构建中包含 dist 目录:

"exclude": [
    "node_modules"
  ]

--- 去

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

dist您的构建文件夹吗?

如果排除outDir对您不起作用,请尝试检查您是否碰巧有具有相同路径和文件名但扩展名不同的重复文件。

当声明文件未从构建中排除时,就会发生这种情况。 每当发生这种情况时,构建器都会尝试构建现有的“.d.ts”文件并将它们替换为相同的文件名。 所以这就是为什么你会得到错误: Cannot write file ... because it would overwrite input file.

为了防止这种情况,您可以在 jour tsconfig.json 文件中排除您的"outDir":"build"

"exclude": [
    "build",
    ....
]

或者,如果您没有定义 outDir,则排除所有d.ts 。 扩展文件:

"exclude": [
    "**/*.d.ts"
    .....
]

希望这可以帮助

@Abadii :也许是因为我在编译时使用了 -b 选项,但这些方法都

@Abadii :也许是因为我在编译时使用了 -b 选项,但这些方法都

你能分享你的tsconfig.json文件以及你的tsc是什么版本吗?

@Abadii :在这里(显然没有更新的排除)。 tsc是3.8.3:

{
    "compilerOptions": {
        "importHelpers": true,
        "target": "es6",
        "module": "CommonJS",
        "lib": ["es2018"],
        "downlevelIteration": true,
        "skipLibCheck": true,
        "strict": true,
        "moduleResolution": "node",
        "esModuleInterop": true,
        "experimentalDecorators": true,
        "outDir": "../lib",
        "sourceMap": true,
        "declaration": true
    },
    "exclude": ["node_modules"]
}

@Abadii :在这里(显然没有更新的排除)。 tsc是3.8.3:

{
    "compilerOptions": {
        "importHelpers": true,
        "target": "es6",
        "module": "CommonJS",
        "lib": ["es2018"],
        "downlevelIteration": true,
        "skipLibCheck": true,
        "strict": true,
        "moduleResolution": "node",
        "esModuleInterop": true,
        "experimentalDecorators": true,
        "outDir": "../lib",
        "sourceMap": true,
        "declaration": true
    },
    "exclude": ["node_modules"]
}

请查看以下 repo。 我已经使用您的 tsconfig.json 重新生成错误:

https://github.com/Abadii/tsconfig

PS 当您删除 ../lib 文件夹时会发生什么? 会建吗?

@Abadii :如果我删除构建文件夹,它将构建(实际上它只会在我删除/清空构建文件夹时构建)。 即使我exclude声明文件和构建文件夹也是如此。
仅供参考,项目结构是这样的:

project\
  lib\
    session.d.ts
    session.js
  src\
    session.ts
    tsconfig.json
  package.json 

我用: tsc -p ./src/tsconfig.json
(实际上,我通常使用rm -rf ./lib && tsc -p src/tsconfig.json构建,但这就是我要修复的内容;))

@Abadii :如果我删除构建文件夹,它将构建(实际上它只会在我删除/清空构建文件夹时构建)。 即使我exclude声明文件和构建文件夹也是如此。

所以现在您知道构建文件夹导致了问题。 不知何故,您的tsc构建不排除您的构建文件夹。 您可以尝试在排除中使用绝对路径。
我还注意到您的构建文件夹超出了您的范围../lib 。 也许这也是它不排除的原因。 尝试./lib作为 outDir 来检查它是否改变了行为
如果您是 Windows 用户,请仔细检查定义的绝对路径是否正确。

@Abadii :谢谢,但我不能使用绝对路径,因为我在多台机器上处理该项目,并且不能保证所有机器上的文件夹结构都相同。 对我来说,这似乎是一个错误 - 我告诉 tsconfig 排除文件夹和声明文件,但事实并非如此。 这应该重新开放吗?

@Abadii :谢谢,但我不能使用绝对路径,因为我在多台机器上处理该项目,并且不能保证所有机器上的文件夹结构都相同。 对我来说,这似乎是一个错误 - 我告诉 tsconfig 排除文件夹和声明文件,但事实并非如此。 这应该重新开放吗?

我明白了,也许您可​​以尝试的最后一件事是将您的 tsconfig 文件放在project/tsconfig.json并更改路径。 如果那行不通,我想我也别无选择。

尝试过:

  1. 设置outDir -> 不。
  2. 设置allowJs: false -> 不。
  3. 不包括.d.ts -> 不。
  4. noEmit: true -> 不。

我已经尝试了这个线程中的每一个建议。 VSCode 错误不仅持续存在,而且指向不再存在的文件。 🤷‍♂️

尝试过:

  1. 设置outDir -> 不。
  2. 设置allowJs: false -> 不。
  3. 不包括.d.ts -> 不。
  4. noEmit: true -> 不。

我已经尝试了这个线程中的每一个建议。 VSCode 错误不仅持续存在,而且指向不再存在的文件。

当您尝试直接通过终端构建时会发生什么?

设置一个 outDir 并确保在构建之前将其清空

@Abadii所以......看起来发生这种情况的原因是,即使没有包含 JS 文件,它们也失败了,因为它们是 CommonJS 模块......🤔......

换句话说,一旦一切都有适当的导入/导出,我就不再遇到这个问题了。 因此,根据该线程的评论以及大量修复,我认为这是红鲱鱼错误之一。 就像,当存在 X 类型的 JS / Intellisense / 编译问题时,VSCode 会抛出此Cannot write file错误。 但是,就我而言,这是通过一个解决方案解决的,而不是该线程中提供的众多解决方案中的所有其他解决方案。 🤷‍♂️ 再一次,它在_不存在_并且_不会被替换_的文件上抛出了这个错误。 那么也许错误正在缓存,而未知错误会引发缓存错误? 类似的东西? 我认为有人需要检查围绕这个特定错误的代码。

在这里发表评论是因为这是我的谷歌搜索中出现的第一件事。

我也遇到了这个问题。 似乎编译过程的某些部分没有识别出它位于排除的目录中。

如果我这样做,我看不到问题:

  "exclude": ["**/*.d.ts", "dist", "node_modules"]

如果我这样做,我确实看到了问题:

  "exclude": ["dist/**/*.d.ts", "dist", "node_modules"]

或这个:

  "exclude": ["**/dist/**/*.d.ts", "dist", "node_modules"]

尽管它抱怨的文件显然在dist ,但仍会发生错误:

error TS5055: Cannot write file '/Users/leila/dev/wip/jest-fp-ts/dist/index.d.ts' because it would overwrite input file.
error TS5055: Cannot write file '/Users/leila/dev/wip/jest-fp-ts/dist/matchers/index.d.ts' because it would overwrite input file.

在我的情况下,我设置了导入,其中src/index.tssrc/matchers/index.ts src/index.ts导入和重新导出,而src/matchers/index.ts又从src/matchers/eitherMatchers/index.ts导入和重新导出。

前两个文件是导致编译错误的文件。 第三个文件没问题。 所以看起来它可能与导入/导出树如何影响编译有关。

我只是在遇到同样的问题时偶然发现了这个问题,并认为我会添加我的结果,以防其他人以同样的方式偶然发现它。

就我而言,我有一个 monorepo,每个包都有一个单独的 tsconfig 文件,所有这些文件都从基础 tsconfig 扩展而来。 每个包配置都有references条目,指向它所依赖的包的路径。 我还在 repo 的根目录中有一个 tsconfig.json,其中包含files: []并引用了所有包目录。 通过这种方式,我可以从根目录运行tsc -b --watch并让它在整个项目中根据更改重建。

这在很长一段时间内运行良好,然后突然开始抛出此错误,即使没有任何配置更改。

我最终通过尝试自行构建错误中报告的一个包而不是构建整个项目来追踪它。

原来问题是我试图让项目本身导入。 包名称是@my-project/utils ,它运行良好,直到我将一些代码从另一个包移动到 utils 包中的文件中。 该代码包含import stuff from '@my-project/utils'; ,这就是导致错误的原因。 通过更改为import stuff from '.';而不是错误消失了..

@jasonk这可能只是暴露了我的无知,但只有当你的 monorepo 被一些可以解决所有这些导入的东西(例如 webpack)捆绑在一起时,这才有效吗? 如果您的 monorepo 由可以独立发布和使用的模块组成,更改为相对导入会导致错误吗?

@Ghirigoro不,问题不是我使用的是包路径,而是它使用包路径从自身内部导入包。 即使没有打字稿,那也行不通。

基本上我所做的相当于:

$ mkdir problem
$ cd problem
$ npm init -y
$ echo 'console.log( "WORKED!" );' > index.js
$ echo 'require( "problem" );' > test.js

如果您然后尝试使用节点运行它:

$ node ./test.js
internal/modules/cjs/loader.js:985
  throw err;
  ^

Error: Cannot find module '/Users/jasonk/problem/test.js'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:982:15)
    at Function.Module._load (internal/modules/cjs/loader.js:864:27)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:74:12)
    at internal/main/run_main_module.js:18:47 {
  code: 'MODULE_NOT_FOUND',
  requireStack: []
}

如果您替换包名称,则它可以正常工作:

$ echo 'require( "." );' > test.js
$ node ./test.js
WORKED!

我怀疑发生的事情是,当构建运行时,从@my-project/utils导入的所有其他包都将该导入解析为packages/utils (因为它们在references tsconfig 中的node_modules/@my-project/utils ,这是到packages/utils的符号链接,但是 TypeScript 没有检测到它们实际上是同一个项目,所以它试图构建它两次,但由于两个构建具有相同的输出目录,我最终遇到了这个错误。

当声明文件未从构建中排除时,就会发生这种情况。 每当发生这种情况时,构建器都会尝试构建现有的“.d.ts”文件并将它们替换为相同的文件名。 所以这就是为什么你会得到错误: Cannot write file ... because it would overwrite input file.

为了防止这种情况,您可以在 jour tsconfig.json 文件中排除您的"outDir":"build"

"exclude": [
    "build",
    ....
]

或者,如果您没有定义 outDir,则排除所有d.ts 。 扩展文件:

"exclude": [
    "**/*.d.ts"
    .....
]

希望这可以帮助

排除我的构建目录为我解决了这个问题

当您尝试使用两个节点运行一个项目时,很可能会发生这种情况。
对于这个假设,您可以在 run build 后测试名为“node”的计算机上的进程数。
我为解决问题所做的工作:
第1步。
相比
node -v

nvm -ls ,正在使用的版本。
在终端集中当前节点版本:
nvm use {neededVersion}
原则上删除nvm中不需要的node版本(这会帮助你的IDE自动判断node的正常版本)。
第2步。
确定 IDE 中的当前节点。 即在 WebStorm 中:
Preferences->Languages & Frameworks -> Node.js and NPM: Node interpreter - 设置需要的版本。
(另外,你可以到处检查每个项目的节点版本(Typescript))

此外,如果 npm 包或 git 子模块在内部使用自己的节点,则会出现此问题

我在 Webdriver IO / WDIO 项目中遇到了这个问题。 当我从 tsconfig.json 的“include”中删除“wdio.config.js”时,它得到了解决。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

kimamula picture kimamula  ·  147评论

metaweta picture metaweta  ·  140评论

rbuckton picture rbuckton  ·  139评论

xealot picture xealot  ·  150评论

disshishkov picture disshishkov  ·  224评论