vscode 通过 ssh 远程开发解决 node.js 版本问题

vscode 通过官方提供的 Remote-ssh 插件,让我们可以直接通过 ssh 的连接方式,打开服务器上的代码库,远程进行开发。

我相信,“高端” vscode 玩家一定尝试过该玩法,简直好处多多。

但是用久了,难免会碰到一些问题。

问题

比如,最近我老是会碰到因为 node.js 版本,导致,项目没法直接通过资源管理器中的 NPM SCRIPTS 运行起来的问题。

什么?!有前端童鞋说自己没碰到过?那么该反思下自己,是不是不喜欢用最新版本的 node.js 去构建项目了。

还是说回咱的问题吧。

之前有个项目,由于比较老了,只能用 14.xx 版本的 node.js 才能正常运行,用更高的版本的 node.js 运行,会有一堆依赖报错的问题,导致项目没法正常的跑起来。

但是,如果升级依赖吧,代价又太大。毕竟这种吃力不讨好的事情,职场老鸟都会避而远之,除非老板同意你这么做,否则没做好的话,锅可少不了。

用 vscode 远程连上服务器的项目后,选择 NPM SCRIPTS 列表中的 npm 脚本,没法正常执行,因为此时用的 node.js 版本不对。

但是,如果通过 vscode 的终端进去,如果版本刚好合适,你会发现可以直接调用类似 npm start 这种命令,直接正常运行项目。

如果不对,也不打紧,可以用 nvm 切换 node.js 版本,接下来你会发现系统中默认的 node.js 版本调整好了,通过类似 npm start 这种命令,项目就可以正常运行了。

但是,直接通过 NPM SCRIPTS 命令还是无法运行,个人推测大概是因为这里还是用的老版本的 node.js。

机缘巧合

虽然这个问题不影响开发,通过命令行去跑项目运行,也不太影响使用体验,但是总感觉有点不爽快。

毕竟发现问题,却没法解决,只能通过别的方式来规避,作为一枚富有探索精神的程序员来说,多少心有不甘。

后来也试图找过一些解决方案,换了好多关键词去 google,甚至 ChatGPT 都想方设法地问了好多次,官方 issue 也翻烂了,还是没找到合适的解决方案。

后来有一次,机缘巧合下,主机升级,重启了。

再连上去,发现用 NPM SCRIPTS ,直接就可以正常运行了,遂恍然大悟。

原来,是因为 vscode-server 每次启动运行的时候,会自动获取当前环境中的 node.js 版本,并用这个版本的 node.js 来运行服务,服务没重启当然不能更换其使用的 node.js 版本了。

验证推测

为了验证自己的推测,连到服务器上探究了一番,果不其然,跟我的猜想一致。

原来当你通过 Remote-SSH 插件连上远程的机器的时候,该插件会在远程的机器的用户文件夹下,创建一个隐藏的目录 .vscode-server,然后顺手在该目录中安装下 vscode-server 软件,然后启动一个 vscode-server 服务。本地的 vscode 其实就是不断地和机器上的 vscode-server 在通信,从而支持通过本地的 vscode 进行远程开发。

# 查看运行的进程
ps -ef |grep .vscode-server
root      1253     1  0 15:00 ?        00:00:00 sh /root/.vscode-server/bin/1a5daa3a0231a0fbba4f14db7ec463cf99d7768e/bin/code-server --start-server --host=127.0.0.1 --accept-server-license-terms --enable-remote-auto-shutdown --port=0 --telemetry-level all --connection-token-file /root/.vscode-server/.1a5daa3a0231a0fbba4f14db7ec463cf99d7768e.token
root      1265  1253  0 15:00 ?        00:00:18 /root/.vscode-server/bin/1a5daa3a0231a0fbba4f14db7ec463cf99d7768e/node /root/.vscode-server/bin/1a5daa3a0231a0fbba4f14db7ec463cf99d7768e/out/server-main.js --start-server --host=127.0.0.1 --accept-server-license-terms --enable-remote-auto-shutdown --port=0 --telemetry-level all --connection-token-file /root/.vscode-server/.1a5daa3a0231a0fbba4f14db7ec463cf99d7768e.token
root      1368  1265  0 15:00 ?        00:00:03 /root/.vscode-server/bin/1a5daa3a0231a0fbba4f14db7ec463cf99d7768e/node /root/.vscode-server/bin/1a5daa3a0231a0fbba4f14db7ec463cf99d7768e/out/bootstrap-fork --type=ptyHost --logsPath /root/.vscode-server/data/logs/20231204T150019
root      7379  1368  0 15:49 pts/4    00:00:00 /bin/bash --init-file /root/.vscode-server/bin/1a5daa3a0231a0fbba4f14db7ec463cf99d7768e/out/vs/workbench/contrib/terminal/browser/media/shellIntegration-bash.sh
root      8272  1265  0 15:53 ?        00:00:06 /root/.vscode-server/bin/1a5daa3a0231a0fbba4f14db7ec463cf99d7768e/node --dns-result-order=ipv4first /root/.vscode-server/bin/1a5daa3a0231a0fbba4f14db7ec463cf99d7768e/out/bootstrap-fork --type=extensionHost --transformURIs --useHostProxy=false
root      8283  1265  0 15:53 ?        00:00:00 /root/.vscode-server/bin/1a5daa3a0231a0fbba4f14db7ec463cf99d7768e/node /root/.vscode-server/bin/1a5daa3a0231a0fbba4f14db7ec463cf99d7768e/out/bootstrap-fork --type=fileWatcher
root      8356  8272  0 15:53 ?        00:00:00 /root/.vscode-server/bin/1a5daa3a0231a0fbba4f14db7ec463cf99d7768e/node /root/.vscode-server/bin/1a5daa3a0231a0fbba4f14db7ec463cf99d7768e/extensions/json-language-features/server/dist/node/jsonServerMain --node-ipc --clientProcessId=8272
root      8601  8374  0 15:53 ?        00:00:00 /root/.vscode-server/code-1a5daa3a0231a0fbba4f14db7ec463cf99d7768e command-shell --cli-data-dir /root/.vscode-server/cli --parent-process-id 8374 --on-port --require-token 420f17f0d59a
root      8753  8272  0 16:15 ?        00:00:01 /root/.vscode-server/bin/1a5daa3a0231a0fbba4f14db7ec463cf99d7768e/node --max-old-space-size=3072 /root/.vscode-server/bin/1a5daa3a0231a0fbba4f14db7ec463cf99d7768e/extensions/node_modules/typescript/lib/tsserver.js --serverMode partialSemantic --useInferredProjectPerProjectRoot --disableAutomaticTypingAcquisition --cancellationPipeName /tmp/vscode-typescript0/a6e9883aad51f1da31b8/tscancellation-5a954acdf4ef24e6466c.tmp* --locale zh-cn --noGetErrOnBackgroundUpdate --validateDefaultNpmLocation --useNodeIpc
root      8754  8272  1 16:15 ?        00:00:04 /root/.vscode-server/bin/1a5daa3a0231a0fbba4f14db7ec463cf99d7768e/node --max-old-space-size=3072 /root/.vscode-server/bin/1a5daa3a0231a0fbba4f14db7ec463cf99d7768e/extensions/node_modules/typescript/lib/tsserver.js --useInferredProjectPerProjectRoot --enableTelemetry --cancellationPipeName /tmp/vscode-typescript0/a6e9883aad51f1da31b8/tscancellation-2340bc35bd699f3648c0.tmp* --locale zh-cn --noGetErrOnBackgroundUpdate --validateDefaultNpmLocation --useNodeIpc
root      8770  8754  0 16:15 ?        00:00:00 /root/.vscode-server/bin/1a5daa3a0231a0fbba4f14db7ec463cf99d7768e/node /root/.vscode-server/bin/1a5daa3a0231a0fbba4f14db7ec463cf99d7768e/extensions/node_modules/typescript/lib/typingsInstaller.js --globalTypingsCacheLocation /root/.cache/typescript/5.2 --enableTelemetry --typesMapLocation /root/.vscode-server/bin/1a5daa3a0231a0fbba4f14db7ec463cf99d7768e/extensions/node_modules/typescript/lib/typesMap.json --validateDefaultNpmLocation
root      8797   543  0 16:19 pts/0    00:00:00 grep --color=auto .vscode-server

所以,了解了原理以后,再想解决我们碰到的问题,就很简单了。

我们把服务器上的 vscode-server 服务关掉,重开一下就好了。

不要用 vscode 指令

当然,这里其实还有个坑。

在 vscode 界面,按住 ctrl+p,然后在出现的输入框里键入 > remote-ssh 会自动列出一些可以使用的 remote-ssh 命令。

里面会有 在主机上终止 VS Code 服务器在主机上卸载 VS Code 服务器 等指令。

但是你用了就会发现一个坑,这些命令都有用,但是他在终止、卸载完,就会立马重新装一个新的 VS Code 服务器,根本不给你调整环境中 node.js 版本的时间。

所以我们成功的执行我们的操作,我们得想别的方案来实现。

在主机上手动卸载 vscode-server

我们连接上主机,通过下面的方式,即可成功卸载掉 vscode-server

# 列出所有依赖 .vscode-server 路径的进程
ps -ef |grep .vscode-server# 杀掉所有依赖于 .vscode-server 路径的进程
ps uxa | grep .vscode-server | awk '{print $2}' | xargs kill -9# 删除掉 .vscode-server 文件夹
rm -rf ~/.vscode-server/

当然卸载掉以后,先别急着重新用我们的 vscode 编辑器连接服务器上的项目。

先用 nvm 切换下系统中默认的 node.js 版本。

# 默认指向对应的想用的 node.js 版本
nvm alias default nodeVersin

为了验证我们设置 node.js 版本的操作是否成功,可以试着断开远程的连接,重新登录下。

如果发现没问题,即可重新在本地用 vscode 连接服务器上的项目。

当然,这地方还有个需要注意的点是,不能傻傻的使用 nvm use nodeVersion 就以为将 node.js 默认的版本切换成功了。

这个操作只针对当前 bash,退出去重新进来,就会发现,系统中默认的 node.js 版本又是之前的版本了。

反思

现在,让我们回过头来看,会发现,其实解决问题的思路并不复杂。关键是,我们要了解清楚引起问题的原因是什么。

知其然更要知其所以然,才能在碰到问题的时候,抽丝剥茧,迅速的定位到问题所在。

参考链接

下面是一些参考资料,有兴趣进一步研究的童鞋可以作为参考

  1. visual studio code - How to kill VSCode remote services on Ubuntu Host - Stack Overflow
  2. arch linux - changing nodejs version through nvm is not persistent - Super User
  3. GitHub - nvm-sh/nvm: Node Version Manager - POSIX-compliant bash script to manage multiple active node.js versions

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/205798.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软考2018下午第六题改编逻辑(状态模式)

在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象 package org.example.状态模式.软考航空;/*** author lst* date 2023年12月07日 15:37*/ class FrequentFlyer {CState state;double flyMiles;public FrequentFlyer() {…

【开源】基于JAVA语言的农家乐订餐系统

项目编号: S 043 ,文末获取源码。 \color{red}{项目编号:S043,文末获取源码。} 项目编号:S043,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户2.2 管理员 三、系统展示四、核…

深圳锐杰金融:用金融力量守护社区健康

深圳市锐杰金融投资有限公司,作为中国经济特区的中流砥柱,近年来以其杰出的金融成绩和坚定的社会责任立场引人注目。然而,这并非一个寻常的金融机构。锐杰金融正在用自己的方式诠释企业责任和慈善精神,通过一系列独特的慈善项目&a…

springboot(ssm高校失物招领平台 校园失物招领系统Java(codeLW)

springboot(ssm高校失物招领平台 校园失物招领系统Java(code&LW) 开发语言:Java 框架:ssm/springboot vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:mysql 5.7(或8.0&am…

Leetcode算法题笔记(1)

目录 哈希1. 两数之和1.1 解法11.1 解法2 2. 字母异位词分组2.1 解法12.2 解法2 3. 最长连续序列3.1 解法 小结 双指针4. 移动零4.1 解法14.2 解法2 5. 盛最多水的容器5.1 解法一5.2 解法二 6. 三数之和6.1 解法16.2 解法2 7. 接雨水7.1 解法1 小结 滑动窗口8. 无重复字符的最长…

自然语言处理基础知识 学习

参考:OpenBMB - 让大模型飞入千家万户 【清华NLP】刘知远团队大模型公开课全网首发|带你从入门到实战_哔哩哔哩_bilibili 图灵测试:imitation Game 模仿游戏 Part of speech tagging 词性标注 Named entity recognition : 命名…

【CMake入门】第三节——构建项目并调用或生成库

系列文章: 【CMake入门】第一节——CMake的安装与简单样例 【CMake入门】第二节——CMake常用指令介绍 构建单文件项目,调用第三方库 # CMake最低版本号要求 cmake_minimum_required(VERSION 2.8)# 项目名称 project(demo)# 设置编译方式 set( CMAKE_B…

[Kubernetes]1.Kubernetes(K8S)介绍,基于腾讯云的K8S环境搭建集群以及裸机搭建K8S集群

一. Kubernetes(K8S)简介 Kubernetes (K8S) 是一个为 容器化应用 提供 集群部署 和 管理 的开源工具,和docker swarm类似,由 Google 开发. Kubernetes 这个名字源于希腊语,意为 “ 舵手 ” 或 “ 飞行员 ” , k8s 这个缩写是因为 k 和 s 之间有八个字符的关系, Google…

Mac电脑统计分析绘图 GraphPad Prism 10 最新 for Mac

GraphPad Prism 10是一款强大的科学数据分析和可视化软件,提供了丰富的统计工具、数据可视化选项和报告生成功能。它使用户能够更轻松地分析和解释实验数据,以支持科学研究和决策。 数据导入和整理:GraphPad Prism 10支持从多种数据源导入数据…

GO设计模式——10、组合模式(结构型)

目录 组合模式(Composite Pattern) 优缺点 使用场景 代码实现 组合模式(Composite Pattern) 组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一…

Mac M1芯片安装es,kibana

安装:brew search elasticsearch //查看版本 brew install elastic/tap/elasticsearch-full //安装这个full版本 。。。等待安装 启动:cd /opt/homebrew/bin ./elasticsearch 访问: http://localhost:9200/ 安装:brew sear…

flink源码分析之功能组件(六)-心跳组件

简介 本系列是flink源码分析的第二个系列,上一个《flink源码分析之集群与资源》分析集群与资源,本系列分析功能组件,kubeclient,rpc,心跳,高可用,slotpool,rest,metrics,future。 本文解释心跳组件,心跳组件监听组件间连接活性,超时触发重连,保证连接有效性;断连…

ChatGPT/GPT4科研实践篇: AI绘图+论文写作+编程

1、熟练掌握ChatGPT提示词技巧及各种应用方法,并成为工作中的助手。 2、通过案例掌握ChatGPT撰写、修改论文及工作报告,提供写作能力及优化工作 3、熟练掌握ChatGPT融合相关插件的应用,完成数据分析、编程以及深度学习等相关科研项目。 4、…

Kafka -- 初识

目录 kafka是什么 Topic Partition Broker Cousumer CousumerGroup Offset reblance broker 消息存储 Isr kafka是什么 Kafka 是一个分布式的消息引擎,能够发布和订阅消息流(类似于消息队列) 以容错的、持久的方式存储消息流 多分区…

MYSQL练题笔记-高级查询和连接-最后一个能进入巴士的人

一、题目相关内容 1)相关的表和题目 2)帮助理解题目的示例,提供返回结果的格式 二、自己初步的理解 一群人要上巴士但是巴士有体重限制,那只能有限个人才能上去 最后输出这个最后一个上去还不超重的人的名字 我认为首先要缩小…

HarmonyOS 开发基础(二)Image

HarmonyOS 开发基础(二)Image Entry Component struct Index {// 创建一个状态变量 img 存储 img 网络地址State img: string https://img1.baidu.com/it/u4049022245,514596079&fm253&app138&sizew931&n0&fJPEG&fmtauto?sec1…

创建vue项目:node.js下载安装、配置环境变量,下载安装cnpm,配置npm的目录、镜像,安装vue、搭建vue项目开发环境(保姆级教程一)

今天讲解 Windows 如何创建 vue 项目,搭建 vue 开发环境,这是这个系列的第一章,有什么问题请留言,请点赞收藏!!! 文章目录 一、Vue简单介绍二、开始搭建1、安装node.js环境2、配置npm下载时的默…

1、Redis变慢原因排查(上)

感觉Redis变慢了,这些可能的原因你查了没 ?(上) Redis 作为一款业内使用率最高的内存数据库,其拥有非常高的性能,单节点的QPS压测能达到18万以上。但也正因此如此,当应用访问 Redis 时,如果发现响应延迟变…

【WPF】使用异步任务来执行耗时的操作,保持UI的响应性。

WPF提供了多种方法来实现异步任务,包括使用Task和async/await关键字、使用BackgroundWorker组件以及使用ThreadPool等。 下面是一些常见的WPF异步任务实现方法: 使用Task和async/await关键字: private async void Button_Click(object sen…

QT----Visual Studio输入中文报错,常量中有换行符

问题描述 在VS中写qt时发现在标题中输入了中文直接把报错无法运行 解决方法1 修改文件的编码方式。在VS菜单栏 工具->自定义-》命令-》选择文件-》添加高级保存选项命令。 双加选中添加中文的文件,文件-》高级保存选项-》修改utf-8就可以运行了 解决方法2…