microsoft / microsoft/TypeScript

`--build --dry` reports a noEmit project reference as perpetually out of date (expects emitted output that noEmit never produces)

未关闭
#63,656 1 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

Needs More Info
主要语言
Go
星标
111k
派生
14.3k
平均合并
2 天 4 小时
30 天内合并 PR
132

描述

Search Terms

noEmit --build --dry, tsconfig.tsbuildinfo noEmit dry build, noEmit index.js does not exist dry build, build dry noEmit project references out-of-date

Version & Regression Information

  • This is the behavior in every version I tried, and I reviewed the FAQ for entries about --build, noEmit, and project references.
  • Reproduced with typescript@5.9.3.
  • Reproduced with typescript@next version 7.1.0-dev.20260717.1.
  • Also reproduced with the TypeScript-Go port, tsgo version 7.0.0-dev+effect-tsgo.0.14.5.

Playground Link

No Playground link. This requires a multi-tsconfig.json project-reference graph and tsc --build --dry.

Code

tsconfig.json

{
  "files": [],
  "references": [
    {
      "path": "./lib"
    }
  ]
}

lib/tsconfig.json

{
  "compilerOptions": {
    "noEmit": true
  },
  "files": ["index.ts"]
}

lib/index.ts

export const value = 1

Run:

tsc --version
tsc --build tsconfig.json --dry --noCheck --verbose
tsc --build tsconfig.json --verbose
tsc --build tsconfig.json --dry --noCheck --verbose
tsc --build tsconfig.json --verbose
tsc --build tsconfig.json --dry --noCheck --verbose
tsc --build tsconfig.json --dry --verbose

Actual behavior

The first dry run reports the referenced noEmit project as out of date because build info does not exist:

Version 5.9.3

Projects in this build:
    * lib/tsconfig.json
    * tsconfig.json

Project 'lib/tsconfig.json' is out of date because output file 'lib/tsconfig.tsbuildinfo' does not exist
A non-dry build would build project '/tmp/ts-noemit-dry-repro/lib/tsconfig.json'

A non-dry build creates lib/tsconfig.tsbuildinfo but, correctly, does not create lib/index.js because noEmit is enabled:

Project 'lib/tsconfig.json' is out of date because output file 'lib/tsconfig.tsbuildinfo' does not exist
Building project '/tmp/ts-noemit-dry-repro/lib/tsconfig.json'...

After that, repeated dry and non-dry builds keep reporting the project as stale because lib/index.js does not exist:

Project 'lib/tsconfig.json' is out of date because output file 'lib/index.js' does not exist
A non-dry build would build project '/tmp/ts-noemit-dry-repro/lib/tsconfig.json'

This remains true after a second non-dry build:

Project 'lib/tsconfig.json' is out of date because output file 'lib/index.js' does not exist
Building project '/tmp/ts-noemit-dry-repro/lib/tsconfig.json'...

Project 'lib/tsconfig.json' is out of date because output file 'lib/index.js' does not exist
A non-dry build would build project '/tmp/ts-noemit-dry-repro/lib/tsconfig.json'

It is not specific to --noCheck; tsc --build tsconfig.json --dry --verbose reports the same missing lib/index.js output after the project has been built.

Expected behavior

Question: is this intended for noEmit projects in a --build references graph?

If this project shape is supported, I would expect build up-to-date logic not to require emitted JavaScript outputs for a project whose compilerOptions.noEmit guarantees those outputs will never exist. After a non-dry build creates the relevant build info, --build --dry should not report the project as perpetually needing a build because lib/index.js is missing.

If this project shape is not supported, it would be useful for --build to report that directly rather than producing a perpetual stale-output result.

Additional information about the issue

The same repro also appears in the TypeScript-Go port:

Version 7.0.0-dev+effect-tsgo.0.14.5

Project 'lib/tsconfig.json' is out of date because output file 'lib/tsconfig.tsbuildinfo' does not exist
A non-dry build would build project '/tmp/tsgo-noemit-dry-repro/lib/tsconfig.json'

Building project 'lib/tsconfig.json'...

Project 'lib/tsconfig.json' is out of date because output file 'lib/index.js' does not exist
A non-dry build would build project '/tmp/tsgo-noemit-dry-repro/lib/tsconfig.json'
Posted on behalf of @schickling
field value
agent_name 💎 co1-zenith
agent_session_id 0dee9117-f0f2-441f-a561-bbb08f2c7e5d
agent_tool Codex CLI
agent_tool_version 0.144.1
agent_runtime Codex CLI 0.144.1
agent_model unknown
runtime_profile /nix/store/1n76sy6i9y3ki3k4w04jksqvygw67sj0-coding-agent-runtime-profile/share/coding-agents/profile.json
skills_manifest /nix/store/jn6r0r7r59x3a525jch4pwzwykszqp60-agent-skills-corpus/share/agent-skills/manifest.json
worktree effect-utils/schickling/2026-07-17-tsgo-refactor
machine dev3
tooling_profile dotfiles@4eac376

贡献指南

打开贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

调研方向

使用列出的 tsc --build --dry --verbose 命令,通过 tsconfig.json、lib/tsconfig.json 和 lib/index.ts 重现该问题。跟踪针对 noEmit 项目的项目引用最新状态检查;如果找到相关的测试位置,则添加有针对性的测试覆盖。支持的 noEmit 引用不再永久显示为过期,或者命令报告不支持这种项目结构,即表示完成。

由索引模型根据 Issue 内容生成。

评估

技术栈
go, typescript
领域
build-system, compilers
Issue 类型
缺陷
难度
4/5
预计耗时
3-5 天
活跃度
冷清
描述清晰度
基本清楚
新手友好度
52/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。