Bump dotnet/node to Node.js v24.7.0#335
Draft
pavelsavara wants to merge 8740 commits intodotnet:dotnet/mainfrom
Draft
Bump dotnet/node to Node.js v24.7.0#335pavelsavara wants to merge 8740 commits intodotnet:dotnet/mainfrom
pavelsavara wants to merge 8740 commits intodotnet:dotnet/mainfrom
Conversation
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Contributes to dotnet/runtime#113786
Why
Part of the Emscripten 5.0.6 toolchain bump for
.NET 11(tracking doc:emsdk_plan_5.0.6.md, Step 4).Emscripten 5.0.6 requires Node
>= 18.3.0(MINIMUM_NODE_VERSIONintools/shared.py). Upstreamemsdk install 5.0.6ships 22.16.0 asdefault and 24.7.0 as the newer offered Node. We standardize the
fork on 24.7.0 so the .NET workload always carries the newer Node.
Previous fork pin:
v18.17.1(LTS "Hydrogen", 2023-08-09).New fork pin:
v24.7.0(Current, 2025-08-27).What this PR does
Single merge commit on top of
dotnet/main:No squash. The merge keeps full upstream history reachable so future
upstream merges into
dotnet/mainsee a clean ancestry.Conflict resolution policy
The 6-major-version jump produced ~6044 conflicting files. They were
resolved as follows:
deps/,lib/,src/,test/,tools/,doc/,benchmark/,typings/,.github/, top-level node files)eng/,Directory.Build.*,NuGet.config,global.json,node.proj,eng/azure-pipelines*.yml,es-metadata.ymldotnet/main(verified: zero-line diff).src/node_version.hv18.17.1so dotnet's LTS=1/"Hydrogen" metadata otherwise survived as a non-conflicting hunk. Now readsMAJOR=24, MINOR=7, PATCH=0, IS_LTS=0, codename="".Mechanically:
git merge -X theirs v24.7.0, then for each remainingunmerged-index entry —
DU/AA/AU/UA→git checkout --theirs,UD/DD→git rm. Final unmerged-index count: 0.dotnet patches NOT re-applied
The following dotnet patches that touched the upstream tree were
intentionally dropped because they are superseded by v24.7.0:
a far newer vendored npm; the old patch no longer applies meaningfully.
v24 layout if AzDO disk usage / CG scans flag anything.
only if 1ES scan still flags it on v24.
the v24 V8's tools/package.json.
eslint vendor still has the symlink.
upstream may have fixed this; re-evaluate after first CodeQL run.
"Build with icu (Build with icu #81)" — re-apply only if the v24 build surfaces the
same failure.
dotnet patches that were kept (none of these collide with v24
upstream content; they live in dotnet-only files):
eng/(Arcade infra, V4 publishing, AzDO pipelines, Signing,CodeQL config, dependabot, common-variables, build scripts).
Directory.Build.props,Directory.Build.targets,node.proj.NuGet.config,global.json,es-metadata.yml,.azuredevops/.azure-pipelines.yml/azure-pipelines-public.yml(live undereng/).VersionPrefix=11.0.0ineng/Versions.props.Validation expected from CI
The AzDO pipeline (
eng/azure-pipelines.yml) should produceruntime.<rid>.Microsoft.NETCore.Runtime.Wasm.Node.Transport 11.0.0-alpha.1.<yymmdd>.<rev>for all 8 RIDs (linux-{x64,arm64,musl-x64,musl-arm64}, osx-{x64,arm64},
win-{x64,arm64}). Each transport package must contain a
nodebinarythat reports:
Maestro then flows the new transport into
dotnet/emsdk/mainperemsdk_plan_5.0.6.mdStep 7.Impact on the produced NuGet package
Package version: not bumped (and shouldn't be)
The transport package version is
11.0.0-alpha.1.<yymmdd>.<rev>, computedfrom
VersionPrefix=11.0.0ineng/Versions.propsplus the Arcadedate+revision stamp. It tracks the .NET workload band, not the Node
version, so a Node 18→24 bump does not change it. Each merge in
mainalready produces a new build-stamped revision, which is whatMaestro flows downstream — that's the version delta consumers see.
Build-time PackageReferences in
node.proj: unchangednode.projconsumes:runtime.<rid>.Microsoft.NETCore.Runtime.Mono.LLVM.{Tools,Sdk}(Linux only)runtime.<rid>.Microsoft.NETCore.Runtime.Wasm.Python.Transport(osx/win)These are inputs that build the Node binary, not transitive deps of
the produced package. Their versions live in
eng/Versions.propsunderruntime…MonoLLVM*Version/runtime…WasmPythonTransportVersionandare unrelated to this PR. (They will be bumped by separate Maestro
flow PRs once the LLVM
dotnet/main-23.xand CPython 3.13.3 packagesare published per
emsdk_plan_5.0.6.mdSteps 2 and 5.)Package contents (the file list inside the .nupkg): expected to change
The
Microsoft.NETCore.Runtime.Wasm.Node.Transportpkgproj is content-driven:Whatever is in
$(NodeInstallDir)after the layout targets innode.projends up in the package. The layout is built up byLayoutNodeWindows/LayoutNodeUnix:$(NodeBuildDir)**then exclude pattern-matchedbuild artifacts:
bytecode_*,mksnapshot.*,node_mksnapshot.*,gen-regexp-special-case.*,genccode.*,genrb.*,iculslocs.*,icupkg.*,*_host.*,openssl*.*,overlapped*.*,torque.*,obj\**,lib\**,*test*.*,mkcodecache*.*,node.xlf\**,node.{exp,iobj,ipdb,lib,map,pdb}. Plus addnpmtree (with alltest/subdirs removed),nodevars.*,install_tools/*,node_etw_provider.man,CHANGELOG.md,LICENSE,README.md.make installoutput, plusCHANGELOG.md/LICENSE/README.md, pluslibc++abi.so.1+libc++.so.1on Linux, plusstrip/codesign/dsymutil pass.
Going v18→v24, the upstream tree (and therefore both
make installoutput and the unfiltered Windows build dir) will produce:
npmtree (npm 9 → ~11.x);deps/(V8 12.x, OpenSSL 3.x, ICU bumped, ada,simdutf, undici, ngtcp2, etc. — all upstream-controlled);
in the Remove list.
The pkgproj globbing handles the npm/deps changes automatically. The
only thing that may need a follow-up is adding new entries to the
Windows Remove list if v24's gyp build emits new helper executables
that we don't want in the final package (e.g. additional snapshot/
codegen helpers). That can only be confirmed from a real CI build —
inspect the diff of
$(NodeInstallDir)\bin\*.exebetween anold-build artifact and the first v24 build, then add Removes for any
new non-shipping exe.
This PR does not preemptively edit
node.proj's Remove list; itkeeps the layout exactly as
dotnet/mainhad it.Hashes that need updating: yes — one
cgmanifest.json:registrations[0].git.commitHashwas2e414d5d1082233c3516fca923fe351d5186c80e(v18.17.1) →updated to
d795edb56765d4ec743bcda5a0c1452bed74de0c(v24.7.0).Component Governance scans this file; without the bump, CG would
keep reporting old vendored versions.
No other hashes (e.g. binary checksums, signatures, package SHAs) are
stored in this fork — the Wasm.Node.Transport package is signed at
publish time and its contents are dynamic.
Version numbers that need fixing: only
src/node_version.h(already done) andcgmanifest.json(above)src/node_version.h— fixed in the merge commit (24.7.0, IS_LTS=0).cgmanifest.json— fixed in a follow-up commit on this branch.eng/Versions.propsVersionPrefix=11.0.0— intentionally notchanged. It's the .NET 11 band marker.
node.proj<NodeEmsdkVersion>node-$(VersionPrefix)-dotnet</NodeEmsdkVersion>→ resolves to
node-11.0.0-dotnet. Independent of upstream Nodeversion. Not changed.
deps/undici/src/package-lock.jsonmentions@types/node-18.19.123—that's an upstream npm devDep pin inside vendored undici, not a
fork-controlled value. Not changed.
Out of scope
release/*branches (servicing). They keep building older Nodetransport versions for older
dotnet/emsdk/release/*bands.dotnet/llvm-projectdotnet/main-23.x,dotnet/binaryendotnet/main,dotnet/cpythonmain→ 3.13.3,dotnet/emscriptendotnet/main→ 5.0.6, and thedotnet/emsdkmainconsolidation PR). Each is a separate PR perthe plan.
Reviewer checklist
upstream tag
v24.7.0(d795edb56765d4ec743bcda5a0c1452bed74de0c).git diff origin/dotnet/main...HEAD -- eng/ Directory.Build.props Directory.Build.targets NuGet.config global.json node.proj es-metadata.ymlproduces no output (dotnet infra untouched).
src/node_version.hmatches upstream v24.7.0 byte-for-byte.cgmanifest.jsoncommitHashmatches upstream v24.7.0.node --versionin the published transport =v24.7.0.$(NodeInstallDir)\bin\from the first green Windows buildvs. the previous Node-18 build; if any new helper
.exes appear,extend the
<NodeFiles Remove="..."/>list innode.projin afollow-up.
release/*branches changed.