Repository navigation
Conversation
|
@codex review |
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
Codex Review: Something went wrong. Try again later by commenting “@codex review”. ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
liangmiQwQ
left a comment
There was a problem hiding this comment.
(🙇 apogolise for late replying)
e4491da to
1d90f21
Compare
…rectory When the upgrade target was the retained previous version, the support probe ran after extracting into that directory, and the failed-install cleanup then deleted the rollback installation on refusal. Probe the binary from a temporary directory first so a refusal leaves every install directory unchanged.
1d90f21 to
fb64f12
Compare
Design update: system-only shims fail instead of searching PATHFollowing the discussion in #3233 (comment) and #3233 (comment), I reworked how System-only shims never search PATH or forward (6f58c4c)
Where vp picks a tool itself, it takes the first PATH match only (ca76a28, a4eb134)
Child PATH: nothing is removed; managed em-only npm (97f6d08)
Global packages (fb64f12)
Follow-up PRs will cover The rebase changed the hashes cited in my d0ed914, 6fb3e80 → 7e9cc00, c120e6c →6b5d4fa7, 6fe9fbe → ac7e269, e4491da → 83eab53 (the upgrade fix is unchanged). |
| /// | ||
| /// On failure, returns the user-facing messages, each printed with a `vp: ` | ||
| /// prefix. This function never executes the tool, so it can be tested directly. | ||
| async fn select_core_tool( |
There was a problem hiding this comment.
Generally speaking, for Nix, are all tools set to system-only mode, or is it still possible to enable managed mode for some of them?
The reason I ask about that is there we imported too much complexity for the case: node is in managed while pnpm is system_only.
I'm wondering if system-only should be allowed only when neither of the two tools is in managed mode.
There was a problem hiding this comment.
On NixOS, I expect mixed configurations involving a managed tool to be uncommon, since Vite+ managed binaries generally won't run without nix-ld.
The specific combination you mentioned (node=managed, pnpm=system-only) is therefore unlikely to be useful there.
On macOS or non-NixOS distributions using Nix, that dynamic-linker constraint often doesn't apply, so mixed modes can work.
I don't know of a concrete use case for mixing modes when using Nix.
The per-tool controls were intended to avoid coupling the behavior to NixOS and to preserve flexibility. That said, if supporting combinations like this adds significant complexity, I'm open to constraining them.
Would you prefer independent per-tool settings, or an explicit constraint between Node and the package-manager mode?
There was a problem hiding this comment.
I am revisiting the entire discussion related to Nix support, and it turns out the issue might be more complex than I initially thought. I may need a bit more time before I make a detailed plan. (🙇 Really sorry!)
|
I miss this description. ignore my request. |
fengmk2
left a comment
There was a problem hiding this comment.
LGTM.
Needs @liangmiQwQ ’s final approval.
There was a problem hiding this comment.
cc @myuron
After learning about what Nix users actually need on Vite+ side.
- As
vp env offalready works with Nix, what users want is a env var which controls the status, ifsystem-onlyis only allowed after runningvp env off, it'll actually deviate from our original intention. - I haven't find cases where users need different states of different tools, either. Nix itself is just an environment manager, I believe users should not mix these features. Supporting this already brings some inconsistency and complexity.
So, I have two suggestions here:
- Revert to the previous logic, where
system-onlydoesn't conflict with managed mode. I've done some local experiments: If any issues arise, we can fix them by splitting the directory. - Instead of having
VP_*_MANAGERfor every single component, I think it's better to intro a newVP_ENV_FORBIDDEN=1as the only main switch.
🙇 I'm really sorry that we proposed some flawed solutions, because of the lack a sufficient understanding of the Nix at the time. Thanks for your time!
# Conflicts: # crates/vp_global_cli/src/self_setup.rs # crates/vp_setup/src/install.rs
Design update:
|
|
@myuron could you update PR description and PR title as well? |
@liangmiQwQ |
ee5b2cf to
dfebbec
Compare
liangmiQwQ
left a comment
There was a problem hiding this comment.
The direction and implement LGTM 💯 (sorry for late responding)
- This differs from @liangmiQwQ's suggestion to keep forwarding and split directories if problems appear. Forwarding from a shim is how
nodeshim loops forever in system-first mode when the systemnodeis a mise shim (vp and shellnodehang) #2728 looped (removed in feat(env): separate system-first shims from the main bin directory #2758), and the same concern was raised in feat(env): add VP_ENV_FORBIDDEN to restrict Vite+ to system Node.js and package managers #3233 (comment). Failing immediately cannot loop, even when a system tool forwards back to Vite+.
I'm okay if Nix users are also okay with that tradeoff.
Preview binary sizes (
|
| Binary | Latest release | Preview | Change |
|---|---|---|---|
vp (macOS ARM64) |
5.42 MiB | 5.44 MiB | +16.48 KiB (+0.30%) |
| NAPI (macOS ARM64) | 42.98 MiB | 42.98 MiB | 0 B (0.00%) |
vp (macOS x64) |
6.89 MiB | 6.91 MiB | +24.20 KiB (+0.34%) |
| NAPI (macOS x64) | 48.23 MiB | 48.23 MiB | +16 B (+0.00%) |
vp (Linux ARM64 GNU) |
6.87 MiB | 6.90 MiB | +32.02 KiB (+0.46%) |
| NAPI (Linux ARM64 GNU) | 32.24 MiB | 32.21 MiB | -32.03 KiB (-0.10%) |
vp (Linux ARM64 musl) |
6.94 MiB | 6.98 MiB | +32.31 KiB (+0.45%) |
| NAPI (Linux ARM64 musl) | 31.44 MiB | 31.44 MiB | +3.00 KiB (+0.01%) |
vp (Linux x64 GNU) |
8.31 MiB | 8.34 MiB | +32.02 KiB (+0.38%) |
| NAPI (Linux x64 GNU) | 36.39 MiB | 36.13 MiB | -265.44 KiB (-0.71%) |
vp (Linux x64 musl) |
8.37 MiB | 8.41 MiB | +34.15 KiB (+0.40%) |
| NAPI (Linux x64 musl) | 35.35 MiB | 35.35 MiB | +3.00 KiB (+0.01%) |
vp (Windows x64) |
6.15 MiB | 6.18 MiB | +34.00 KiB (+0.54%) |
| NAPI (Windows x64) | 31.97 MiB | 31.98 MiB | +7.00 KiB (+0.02%) |
| Trampoline (Windows x64) | 13.00 KiB | 13.00 KiB | 0 B (0.00%) |
| Installer (Windows x64) | 4.66 MiB | 4.67 MiB | +10.00 KiB (+0.21%) |
vp (Windows ARM64) |
5.39 MiB | 5.41 MiB | +27.50 KiB (+0.50%) |
| NAPI (Windows ARM64) | 28.27 MiB | 28.27 MiB | +6.50 KiB (+0.02%) |
| Trampoline (Windows ARM64) | 13.00 KiB | 13.00 KiB | 0 B (0.00%) |
| Installer (Windows ARM64) | 3.84 MiB | 3.85 MiB | +7.50 KiB (+0.19%) |
gzip -9 sizes
| Binary | Latest release | Preview | Change |
|---|---|---|---|
vp (macOS ARM64) |
3.23 MiB | 3.24 MiB | +14.70 KiB (+0.44%) |
| NAPI (macOS ARM64) | 18.64 MiB | 18.64 MiB | +1.16 KiB (+0.01%) |
vp (macOS x64) |
3.41 MiB | 3.43 MiB | +11.75 KiB (+0.34%) |
| NAPI (macOS x64) | 19.87 MiB | 19.88 MiB | +1.83 KiB (+0.01%) |
vp (Linux ARM64 GNU) |
3.73 MiB | 3.74 MiB | +12.80 KiB (+0.34%) |
| NAPI (Linux ARM64 GNU) | 13.72 MiB | 13.71 MiB | -12.80 KiB (-0.09%) |
vp (Linux ARM64 musl) |
3.75 MiB | 3.76 MiB | +17.13 KiB (+0.45%) |
| NAPI (Linux ARM64 musl) | 13.41 MiB | 13.41 MiB | +3.78 KiB (+0.03%) |
vp (Linux x64 GNU) |
3.80 MiB | 3.81 MiB | +13.25 KiB (+0.34%) |
| NAPI (Linux x64 GNU) | 14.55 MiB | 14.40 MiB | -154.45 KiB (-1.04%) |
vp (Linux x64 musl) |
3.82 MiB | 3.83 MiB | +16.32 KiB (+0.42%) |
| NAPI (Linux x64 musl) | 14.08 MiB | 14.08 MiB | +247 B (+0.00%) |
vp (Windows x64) |
2.84 MiB | 2.86 MiB | +16.95 KiB (+0.58%) |
| NAPI (Windows x64) | 13.09 MiB | 13.09 MiB | +2.38 KiB (+0.02%) |
| Trampoline (Windows x64) | 7.14 KiB | 7.14 KiB | +1 B (+0.01%) |
| Installer (Windows x64) | 2.23 MiB | 2.24 MiB | +5.16 KiB (+0.23%) |
vp (Windows ARM64) |
2.72 MiB | 2.73 MiB | +13.13 KiB (+0.47%) |
| NAPI (Windows ARM64) | 12.42 MiB | 12.42 MiB | +1.01 KiB (+0.01%) |
| Trampoline (Windows ARM64) | 6.93 KiB | 6.93 KiB | 0 B (0.00%) |
| Installer (Windows ARM64) | 2.13 MiB | 2.13 MiB | +6.13 KiB (+0.28%) |
Raw sizes are uncompressed file sizes. gzip sizes recompress each binary at level 9; they are not package or download archive sizes.
The baseline uses published release files, including NAPI packages from npm at the same version. Build versions and toolchains can affect the difference.
Registry bridge build (
|
| Package | Version |
|---|---|
vite-plus |
0.0.0-commit.759196d2423a2f8608b35cbe21626d06e6d37f59 |
@voidzero-dev/vite-plus-core |
0.0.0-commit.759196d2423a2f8608b35cbe21626d06e6d37f59 |
create-vite-plus |
0.0.0-commit.759196d2423a2f8608b35cbe21626d06e6d37f59 |
Install the Vite+ CLI built from this commit, then migrate a project:
# macOS / Linux
curl -fsSL https://raw.githubusercontent.com/myuron/vite-plus/759196d2423a2f8608b35cbe21626d06e6d37f59/packages/cli/install.sh | VP_PR_VERSION=3233 VP_LEGACY_INSTALLER_URL=https://raw.githubusercontent.com/myuron/vite-plus/759196d2423a2f8608b35cbe21626d06e6d37f59/packages/cli/install-legacy.sh bash# Windows (PowerShell)
$env:VP_PR_VERSION="3233"; $env:VP_LEGACY_INSTALLER_URL="https://raw.githubusercontent.com/myuron/vite-plus/759196d2423a2f8608b35cbe21626d06e6d37f59/packages/cli/install-legacy.ps1"; irm https://raw.githubusercontent.com/myuron/vite-plus/759196d2423a2f8608b35cbe21626d06e6d37f59/packages/cli/install.ps1 | iexOr install with Homebrew (macOS / glibc Linux):
These commands use the formula and binary from this published commit. Replace brew install with brew reinstall if the tap package is already installed.
If Homebrew Core’s vite-plus is installed, run brew uninstall vite-plus first. This keeps your user data; do not run vp implode to switch installations.
(
set -eu
export HOMEBREW_NO_AUTO_UPDATE=1
export HOMEBREW_VP_PR_VERSION=759196d2423a2f8608b35cbe21626d06e6d37f59
brew tap voidzero-dev/vite-plus https://github.com/voidzero-dev/vite-plus
preview_tap="$(brew --repository voidzero-dev/vite-plus)"
git -C "$preview_tap" fetch --depth=1 https://github.com/myuron/vite-plus.git "$HOMEBREW_VP_PR_VERSION"
git -C "$preview_tap" switch --detach "$HOMEBREW_VP_PR_VERSION"
brew install voidzero-dev/vite-plus/vp
brew test voidzero-dev/vite-plus/vp
"$(brew --prefix)/bin/vp"
)The tap stays at the tested commit. Return it to main after testing:
git -C "$(brew --repository voidzero-dev/vite-plus)" switch mainOr download the standalone Windows installer built from this commit:
| Architecture | Installer |
|---|---|
| x64 | vp-setup-x86_64-pc-windows-msvc.exe |
| Arm64 | vp-setup-aarch64-pc-windows-msvc.exe |
GitHub requires you to sign in and downloads each installer as a ZIP artifact. Extract vp-setup.exe, then run it against this preview build:
.\vp-setup.exe --version "0.0.0-commit.759196d2423a2f8608b35cbe21626d06e6d37f59" --registry "https://registry-bridge.viteplus.dev/"After installing, upgrade the current project's vite-plus to this test build with:
vp migrateOr create a new project from this commit without installing the CLI:
export npm_config_registry=https://registry-bridge.viteplus.dev/ pnpm_config_registry=https://registry-bridge.viteplus.dev/
pnpm create vite-plus@0.0.0-commit.759196d2423a2f8608b35cbe21626d06e6d37f59 # or: npm create vite-plus@0.0.0-commit.759196d2423a2f8608b35cbe21626d06e6d37f59$env:npm_config_registry="https://registry-bridge.viteplus.dev/"; $env:pnpm_config_registry="https://registry-bridge.viteplus.dev/"
pnpm create vite-plus@0.0.0-commit.759196d2423a2f8608b35cbe21626d06e6d37f59 # or: npm create vite-plus@0.0.0-commit.759196d2423a2f8608b35cbe21626d06e6d37f59pnpm 11+ reads pnpm_config_registry, npm and older pnpm read npm_config_registry. The new project pins this build, so keep the registry set for later installs, or configure it as below.
Or point your package manager at the bridge registry https://registry-bridge.viteplus.dev/:
| Package manager | Registry config |
|---|---|
| npm / pnpm / Bun | .npmrc: registry=https://registry-bridge.viteplus.dev/ |
| Yarn (v2+) | .yarnrc.yml: npmRegistryServer: "https://registry-bridge.viteplus.dev/" |
Then pin the build (vite aliases to vite-plus-core; pnpm can use a catalog, npm an overrides entry):
{
"devDependencies": {
"vite-plus": "0.0.0-commit.759196d2423a2f8608b35cbe21626d06e6d37f59",
"vite": "npm:@voidzero-dev/vite-plus-core@0.0.0-commit.759196d2423a2f8608b35cbe21626d06e6d37f59"
}
}
Summary
Part of #1899 (letting NixOS and similar systems use only system Node.js and package managers). Follows #3143.
VP_ENV_FORBIDDEN=1stops Vite+ from managing Node.js and every package-manager family. Vite+ then never downloads, reuses from the cache, or resolves over the network a managed runtime or package manager, whateverconfig.jsonor theVP_*_MANAGERvariables say. Shims and the tools Vite+ selects itself use only the system tools on PATH.VP_ENV_FORBIDDENstays undocumented until the follow-up PR covers the remaining commands. Without it, nothing changes.What's Changed
Switch and safety net
1enables it. It covers Node.js and all package-manager families; per-tool or mixed setups are not supported.DisabledByEnvForbiddenbefore their cache lookups: the Node.js download and version index, the package-manager download, binary lookup and bootstrap, and registry version resolution.Shims and tool selection
VP_ENV_FORBIDDEN=1, thenodeand package-manager shims never search PATH or forward, including underVP_BYPASS.config.json, the error suggestsvp env off <component>.system_first, reaching a shim means no system tool comes before it.vp env exec,vpx, global package binaries), it uses the first PATH match only.vp_command::classify_first_path_matchreports a Vite+ shim or a managed install there as an error instead of skipping it.Installers and
vp upgradeA
vpwithout this change would ignoreVP_ENV_FORBIDDENand download managed tools, so installers andvp upgraderefuse such a target while it is set.vpanswersVP_SELF_SETUP_SUPPORT_CHECK=env-forbiddenwith a second line,vite-plus-self-setup-env-forbidden. The response to the existing check (vite-plus-self-setup-v1) is unchanged, because released installers compare it exactly.install.sh,install.ps1, andvp_installerprobe with the new value only whenVP_ENV_FORBIDDEN=1, and fail before the legacy installer path.vp upgradechecks the extracted binary before installing dependencies, andvp upgrade --rollbackchecks the previous version before switching.Installation-time setup
system_first, even whenVP_*_MANAGER=yesis set, so the shims sit after the system tools. The Homebrew setup does the same.nodeandpnpmon PATH, which must be system tools. Both tools and the release'sengines.nodeare checked before the installation is changed. Forvp upgrade,engines.nodecomes from thevite-plusmetadata that is already fetched.package.jsonomitspackageManager, and pnpm runs with--config.manage-package-manager-versions=falseand--ignore-scripts. It gets the PATH used for the check, so its#!/usr/bin/env nodefinds the checkednode.VP_SETUP_NODE_VERSIONis ignored with a warning.This relaxes two guarantees from #3269, only when
VP_ENV_FORBIDDEN=1is set:.node-version/vpNodeVersion) becomes any system Node.js that satisfiesengines.node.10.34.7becomes the system pnpm. If it cannot use the installation lockfile, the error andupgrade.logpoint toVP_SETUP_SKIP_INSTALL_LOCKFILE=1.Scope
Follow-up PR:
vp env use,vp env install, andvp env pin <version>.vp install,vp run, …) and status commands use the system tools without network resolution.Until then, these commands download nothing: the delegated commands fail with
DisabledByEnvForbidden.Testing
just check,just lint,just testpackage.json,engines.noderesolution, the cached pnpm bootstrap, the support probe, andvp upgradekeeping the current version when the system tools are rejectedshim_system_first_fallback:env_forbidden_overrides_managed_shims(unreachable Node.js mirror and registry; no managed install is created),env_forbidden_child_processescommand_self_setup:command_self_setup_env_forbidden_probe,command_self_setup_env_forbidden_config,command_self_setup_env_forbidden_in_place(the system-tool check runs before setup changes anything)command_self_setup_external:command_self_setup_external_homebrew_env_forbidden.github/scripts/test-install-bootstrap.sh,.github/scripts/test-install-bootstrap.ps1, andtest-install-legacy-remote.ps1cover theenv-forbiddenscenarios (CI)Some existing
command_self_setupand shim snapshot cases fail locally on NixOS before and after this change (same cases), so CI covers them.