diff --git a/docker/310.Dockerfile b/docker/310.Dockerfile index f9cb29b7..6cbbc127 100644 --- a/docker/310.Dockerfile +++ b/docker/310.Dockerfile @@ -73,7 +73,7 @@ ENV PNPM_HOME=${QL_DIR}/data/dep_cache/node \ HOME=/root ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:${PNPM_HOME}:${PYTHON_HOME}/bin:${HOME}/bin \ - NODE_PATH=/usr/local/bin:/usr/local/lib/node_modules:${PNPM_HOME}/global/5/node_modules \ + NODE_PATH=/usr/local/bin:/usr/local/lib/node_modules \ PIP_CACHE_DIR=${PYTHON_HOME}/pip \ PYTHONPATH=${PYTHON_HOME}:${PYTHON_HOME}/lib/python${PYTHON_SHORT_VERSION}:${PYTHON_HOME}/lib/python${PYTHON_SHORT_VERSION}/site-packages diff --git a/docker/Dockerfile b/docker/Dockerfile index 6cde05d9..405260ac 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -73,7 +73,7 @@ ENV PNPM_HOME=${QL_DIR}/data/dep_cache/node \ HOME=/root ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:${PNPM_HOME}:${PYTHON_HOME}/bin:${HOME}/bin \ - NODE_PATH=/usr/local/bin:/usr/local/lib/node_modules:${PNPM_HOME}/global/5/node_modules \ + NODE_PATH=/usr/local/bin:/usr/local/lib/node_modules \ PIP_CACHE_DIR=${PYTHON_HOME}/pip \ PYTHONPATH=${PYTHON_HOME}:${PYTHON_HOME}/lib/python${PYTHON_SHORT_VERSION}:${PYTHON_HOME}/lib/python${PYTHON_SHORT_VERSION}/site-packages diff --git a/shell/otask.sh b/shell/otask.sh index f997911d..c6612bd1 100755 --- a/shell/otask.sh +++ b/shell/otask.sh @@ -83,6 +83,16 @@ clear_non_sh_env() { fi } +append_node_dependency_path() { + export PREV_NODE_PATH="${NODE_PATH:=}" + + local pnpm_global_path=$(pnpm root -g 2>/dev/null) + if [[ -n "$pnpm_global_path" ]]; then + export QL_NODE_GLOBAL_PATH="$pnpm_global_path" + export NODE_PATH="${NODE_PATH:+${NODE_PATH}:}${pnpm_global_path}" + fi +} + enter_script_workdir() { local use_dot_prefix="$1" @@ -241,7 +251,7 @@ check_nounset() { } main() { - if [[ $1 == *.js ]] || [[ $1 == *.py ]] || [[ $1 == *.pyc ]] || [[ $1 == *.sh ]] || [[ $1 == *.ts ]]; then + if [[ $1 == *.js ]] || [[ $1 == *.mjs ]] || [[ $1 == *.py ]] || [[ $1 == *.pyc ]] || [[ $1 == *.sh ]] || [[ $1 == *.ts ]]; then if [[ $1 == *.sh ]]; then timeoutCmd="" fi @@ -277,6 +287,7 @@ main() { handle_task_start "${task_shell_params[@]}" check_file "${task_shell_params[@]}" +append_node_dependency_path if [[ $isJsOrPythonFile == 'false' ]]; then run_task_before "${task_shell_params[@]}" fi @@ -286,6 +297,8 @@ main "${task_shell_params[@]}" if [[ "$set_u_on" == 'true' ]]; then set -u fi +export NODE_PATH="${PREV_NODE_PATH}" +unset QL_NODE_GLOBAL_PATH if [[ $isJsOrPythonFile == 'true' ]]; then export NODE_OPTIONS="${PREV_NODE_OPTIONS}" export PYTHONPATH="${PREV_PYTHONPATH}" diff --git a/shell/preload/sitecustomize.js b/shell/preload/sitecustomize.js index dbb9198f..44dc1bea 100644 --- a/shell/preload/sitecustomize.js +++ b/shell/preload/sitecustomize.js @@ -1,7 +1,36 @@ const { execSync } = require('child_process'); +const Module = require('module'); +const path = require('path'); const client = require('./client.js'); require(`./env.js`); +function preferGlobalNodeModules() { + const { QL_NODE_GLOBAL_PATH } = process.env; + if (!QL_NODE_GLOBAL_PATH || Module._qlGlobalPathPatched) { + return; + } + + const originalResolveFilename = Module._resolveFilename; + Module._resolveFilename = function (request, parent, isMain, options) { + if ( + !Module.builtinModules.includes(request) && + !request.startsWith('node:') && + !request.startsWith('.') && + !path.isAbsolute(request) + ) { + try { + return originalResolveFilename.call(this, request, parent, isMain, { + ...options, + paths: [QL_NODE_GLOBAL_PATH], + }); + } catch (error) {} + } + + return originalResolveFilename.call(this, request, parent, isMain, options); + }; + Module._qlGlobalPathPatched = true; +} + function expandRange(rangeStr, max) { const tempRangeStr = rangeStr .trim() @@ -113,6 +142,8 @@ try { return; } + preferGlobalNodeModules(); + process.on('SIGTERM', (code) => { process.exit(15); }); diff --git a/shell/share.sh b/shell/share.sh index cad30659..585d885d 100755 --- a/shell/share.sh +++ b/shell/share.sh @@ -65,17 +65,7 @@ link_name=( ) init_env() { - local pnpm_global_path=$(pnpm root -g 2>/dev/null) - export NODE_PATH="/usr/local/bin:/usr/local/lib/node_modules${pnpm_global_path:+:${pnpm_global_path}}" - - # 如果存在 pnpm 全局路径,创建软链接 - if [[ -n "$pnpm_global_path" ]]; then - # 确保目标目录存在 - mkdir -p "${dir_root}/node_modules" - # 链接全局模块到项目的 node_modules - ln -sf "${pnpm_global_path}/"* "${dir_root}/node_modules/" 2>/dev/null || true - fi - + export NODE_PATH="/usr/local/bin:/usr/local/lib/node_modules" export PYTHONUNBUFFERED=1 }