拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

环境配置全攻略:从Java、Python到深度学习一次讲透

环境配置全攻略:从Java、Python到深度学习一次讲透

1. 聊一聊“环境配置kkkk”:配环境配到无语,几乎是每个开发者的必经之路

先解释一下标题里那个“kkkk”,我第一眼看到的时候直接笑出声。这根本不是键盘乱敲,这是配环境配到心态崩溃之后,对着屏幕打出的一串苦笑。你去搜一下“环境配置”四个字,后面跟的全是“nodejs安装及环境配置”“vscode配置python环境”“anaconda配置pytorch环境”“win11系统java环境配置”——从编程语言到深度学习框架,从前端工程到嵌入式开发,几乎每一个技术栈背后,都站着一批被环境配置折磨过的人。

我做了十几年开发和带项目,见过太多人栽在第一步:代码本身没问题,但环境配不上,直接劝退。有人装Python装了三遍,最后连pip都不知道去哪了;有人跟着教程配Java,JAVA_HOME填了,结果一敲java -version还是“不是内部或外部命令”;还有人把Anaconda、PyCharm、VSCode全装了一遍,最后分不清自己到底在用哪个解释器。这些问题单独看都不难,但架不住零散、琐碎、报错信息还不说人话。

所以这篇我想把“环境配置”这件事,系统性地掰开揉碎讲一遍。它不是一篇只讲某个单一工具的文章,而是把全网搜得最多的那几类场景——语言运行时、C/C++与嵌入式、深度学习、工程化站点——串起来,讲清楚背后的通用逻辑,再给一些可以直接抄作业的配置步骤。无论你是刚摸电脑的小白,还是被某个冷门环境坑到怀疑人生的老手,应该都能在里面找到对应的解法。

1.1 一个真实场景:配环境两小时,写代码两分钟

先从一个特别常见的场景说起。你拿到了一个开源项目,README写了一句话:pip install -r requirements.txt,然后跑起来。结果你一执行,先报pip版本不对,再报torch装不上,最后好不容易装完了,import又报缺DLL。你开始百度,搜到一篇帖子说“建议装Anaconda”,于是你去装Anaconda;装完再看帖,帖子又说“建议用Python 3.8”,你一看自己装了3.12,于是又去折腾多版本共存。折腾到晚上十点,代码一行没写,倒是把卸载和重装练得炉火纯青。

这不是段子。我自己带过的新人里,十有八九都经历过这个循环。问题不在于某个软件装错了,而在于从一开始就没建立起一套清晰的配置思路:知道要装什么、为什么装、装完改哪里、怎么验证。配环境之所以让人崩溃,恰恰是因为它不像是写代码那样有即时反馈,很多步骤做完之后没有任何提示,直到你运行程序时才集中爆发。

1.2 热搜词拆开看,其实就是四类需求

把开头那些热搜词排一下队,你会发现“环境配置”的搜索需求高度集中在几个方向:

需求类型典型热搜核心痛点
语言运行时nodejs安装及环境配置、win11 java环境配置、maven环境配置JDK/Node/Python装了但命令不识别,多版本切换混乱
IDE与编译链vscode配置c/c++、pycharm配置python、keil环境配置IDE只装了壳,编译器/调试器/解释器没配对
深度学习与科研anaconda配置pytorch、yolov11环境配置、bevformer环境配置依赖库版本相互打架,GPU版和CPU版分不清
工程化与移动端本地+虚拟机多端口nginx多站点、一键配置adb、windows pcl多站点、多设备、多依赖库的场景组合复杂

这四类看起来差异很大,但骨子里的逻辑是相通的:环境配置的本质,就是让你机器上的工具链能被操作系统找到、被IDE识别、被代码正确调用。下面我按这四条主线挨个拆,每一条都会给到具体可复现的配置过程,以及我踩过之后觉得必须提醒的坑。

2. 语言运行时三主线:Java、Node.js、Python怎么配才不返工

先聊最基础、也最绕不开的语言运行时。无论你是做后端、前端还是数据处理,几乎逃不开这三样。但恰恰是最基础的东西,坑最多。

2.1 Win11下的JDK与Maven:两个最容易挂的环节

先明确一个概念:JDK不是装完就能用的,装完只是把文件放到了硬盘上,系统还得知道“去哪找java这个命令”。这就是环境变量的作用。Windows下配JDK的标准路径是这样的:

  1. 下载JDK(建议选OpenJDK或者发行版的LTS版本,比如JDK 8、JDK 11、JDK 17,别追最新版)。
  2. 安装到一个不含空格和中文的路径下,比如D:\Java\jdk-17。这一步很多人不在乎,但空格和中文在后续一些老工具链里确实会引发诡异的问题。
  3. 打开系统环境变量设置,新建JAVA_HOME,值填D:\Java\jdk-17。
  4. 编辑Path,新增两条:%JAVA_HOME%\bin和%JAVA_HOME%\jre\bin(JDK 8及以前需要jre那条,之后版本没有jre目录,不加也行)。
  5. 打开新开的命令行窗口,输入java -version和javac -version验证。

很多人用完说“明明配了还是不行”,九成是卡在第四步之后没开新窗口。命令行窗口的环境变量是启动时读取的,你配完必须关掉重开,否则怎么敲都是旧值。另外,Win11设置里搜索“环境变量”可以直接进入图形界面,比右键“此电脑→属性”快很多。

Maven的配置逻辑跟JDK几乎一样:先确保JAVA_HOME正确,然后下载Maven压缩包解压到D:\Maven\apache-maven-3.9.x,配置MAVEN_HOME,再把%MAVEN_HOME%\bin加进Path。Maven有个特殊的坑:它默认会从中央仓库下载依赖,速度慢而且容易中断。建议直接改conf/settings.xml,把localRepository指定到你想要的位置(比如D:\Maven\repository),并配置一个国内镜像源加速。改完跑一次mvn -v,再随便建个项目跑mvn compile,能正常拉依赖就说明OK了。

Mac上配Maven其实更直观,就是改~/.zshrc(或~/.bash_profile),导出JAVA_HOME和MAVEN_HOME两个变量。很多Mac用户卡在“明明配了但不生效”,多半是忘了source ~/.zshrc,或者终端开了新标签页导致配置没重新加载。这不是你笨,是终端环境变量加载机制本身就容易让人困惑,后面第6章我会专门讲PATH的原理。

2.2 Node.js与npm:用版本管理器替代“永远装最新版”

Node.js的环境配置,最大的坑不是装不上,而是版本换起来太痛。你手上可能同时有好几个项目:老项目要用Node 14,新项目要Node 18,还有个实验项目要Node 20。如果你只装了一个全局Node,那每次切换都得卸载重装,纯属折磨。

所以我的建议非常明确:直接上版本管理器。Windows用户推荐用nvm-windows,macOS/Linux用户用nvm。以Windows为例,装完nvm之后,日常操作就三条命令:

nvm install 18.20.4 nvm use 18.20.4 node -v

nvm use完事之后,node和npm会自动指向当前激活的版本。这一步理解透了,后面所有Node相关的问题都迎刃而解。

安装完Node之后,还要顺手确认npm的全局路径和缓存路径。很多新手遇到的“npm装了个包但命令行不识别”,就是因为全局包目录没有被加进Path。配置方式是在用户目录下建.npmrc文件,指定prefix和cache,然后把prefix对应的目录(比如C:\Users\你的用户名\AppData\Roaming\npm)加进Path。另外,npm默认源在国外,速度不稳定,建议直接配置国内镜像源,一行命令搞定:

npm config set registry https://registry.npmmirror.com

Vue项目的环境配置,本质就是Node.js环境配好之后,再装一个全局脚手架的问题:npm install -g @vue/cli,然后vue --version验证。如果vue命令不识别,回上面检查npm全局路径。前端圈子的“环境配置”,八成以上都是这个链路。

2.3 Python与Anaconda:环境隔离是成本最低的习惯

Python的环境配置,是所有语言里最两极分化的:有人觉得简单——装个Python就能跑;有人觉得是地狱——装了Python,又装Anaconda,又在PyCharm里选解释器,又在VSCode里切换环境,最后连自己在用哪个Python都不知道。

我个人的答案是:不要裸装Python,直接用Anaconda(或者Miniconda)做环境管理。Anaconda的核心价值不是自带了多少库,而是它能创建互相隔离的虚拟环境。你可以为每个项目单独建一个环境,A项目用Python 3.8,B项目用Python 3.10,互不干扰。

# 创建虚拟环境,指定Python版本 conda create -n myproject python=3.9 # 激活环境 conda activate myproject # 安装包 pip install requests # 退出环境 conda deactivate

PyCharm配置Python环境的正确姿势是:新建项目时,解释器选“Previously configured interpreter”或者“Conda Environment”,指向你conda环境目录下的python.exe,而不是直接用Anaconda自带的那个base环境。VSCode里则是装好Python插件后,在命令面板里搜“Python: Select Interpreter”,选到对应的conda环境即可。

这里有一个几乎所有人都会犯的错:在VSCode里装了Python插件,却忘了右下角显示的“解释器路径”可能不是你当前激活的conda环境。结果你明明在终端conda activate了A环境,VSCode却用B环境跑代码,报错说某个包不存在。解决办法很简单:每次打开项目,先手动确认一次解释器。这个习惯能帮你省掉大量“奇怪的问题”排查时间。

3. C/C++与嵌入式工具链:VSCode、STM32、Keil、PCL的高危地带

如果说Python环境配置是“让人困惑”,那C/C++和嵌入式这边就是“让人想砸电脑”。原因很简单:这类工具链往往不是“一个安装包搞定”,而是编译器、调试器、构建系统、IDE插件各管一摊,四者还要版本匹配。

3.1 VSCode配置C/C++:编译器选对,一切都对

先纠正一个普遍误解:VSCode本身不是编译器,它只是个编辑器。你安装C/C++扩展,只是为了获得语法高亮和智能提示;真正把.c文件变成.exe的,是编译器。

Windows下配置VSCode的C/C++环境,我推荐用MinGW-w64里面的GCC。装好之后,把bin目录(里面有gcc.exe、g++.exe、gdb.exe)加进Path,然后在命令行里验证:

gcc --version gdb --version

VSCode这边只需要做两件事:装C/C++扩展,然后配置.vscode/tasks.json和.vscode/launch.json。tasks.json用来告诉VSCode怎么编译——通常就是调gcc -g ${file} -o ${fileDirname}/${fileBasenameNoExtension}.exe;launch.json用来告诉调试器怎么调试——选择“C++ (GDB/Launch)”自动生成即可。

这个配置看起来是“抄作业”,但很多人抄都抄不对,原因在于不懂两个文件到底在做什么。我建议你第一次配置时,手工敲一遍模板而不是全盘复制,敲的过程中你会自然理解:tasks.json是“编译时做什么”,launch.json是“调试时加载什么程序”,preLaunchTask这个字段的意思是“调试之前先执行编译任务”。理解了这些,以后任何项目都能自己改,而不是每次换个文件夹就重新搜一遍教程。

3.2 Ubuntu下配置C语言环境:别一上来就装IDE

Ubuntu下配置C语言环境的门槛其实比Windows低,因为没有“路径带空格”之类的破事,关键是别绕弯路。我见过有人为了“方便”,在Ubuntu里装Clion、装VSCode,然后卡在插件配置半天。我的建议是老老实实先走命令行:

sudo apt update sudo apt install build-essential gdb

这条命令装的是gcc、g++、make和一堆基础库,属于一个包全搞定。装完跑gcc --version验证,然后用nano或者vim写个hello.c,手工编译一遍:

gcc hello.c -o hello ./hello

这个流程走通之后,你再去装VSCode或者CLion做开发都不迟。因为这时候你已经知道“IDE配了一堆东西,本质上还是在替你调用gcc”,再出问题你能自己定位是IDE的配置问题还是编译器的问题。

3.3 STM32、Keil、CLion JNI与PCL:嵌入式与底层库的配置逻辑

嵌入式这块的水更深。以STM32开发为例,你在VSCode里配置和用Keil配置是两条完全不同的路线。

用Keil(MDK-ARM)的话,核心就三件事:确认软件装好、确认设备库(Pack)装好、在Options for Target里选对芯片型号和下载器。很多人卡在用DAP下载器连不上板子,其实多半不是代码问题,而是Flash Download里没有勾选“Reset and Run”,或者芯片选成了别的型号。这些操作看着跟“环境配置”无关,但它就是嵌入式环境里最常出现的坑。

如果你在VSCode里配STM32,那配置复杂度会明显上升:你需要arm-none-eabi-gcc编译器、OpenOCD调试器、Cortex-Debug插件,还需要用CMake组织构建。这类配置的通用逻辑是:先把每个工具链单独验证一遍(arm-none-eabi-gcc --version、openocd --version),再谈IDE集成,否则你永远分不清是编译器坏了还是插件坏了。

再看看CLion配置JNI环境和Windows下配置PCL这两类“硬核”需求。它们表面上风马牛不相及,实际上踩的是同一个坑:依赖库太多,版本相互制约。CLion里搞JNI需要JDK、CMake和一个能识别jni.h路径的配置,核心是把JAVA_HOME正确传给CMake;Windows下装PCL(点云库),依赖的一大串:Boost、Eigen、FLANN、VTK、Qt……如果你手动逐个编译,能把一周时间搭进去。这类场景我最推荐的做法是:优先用vcpkg这类包管理器一键拉取依赖,比如:

vcpkg install pcl[vtk]:x64-windows

然后通过CMake的toolchain文件把它接进来。虽然vcpkg首次编译也很漫长,但至少它是“自动化地在做”,你不用半夜守着屏幕看哪个依赖头文件又找不到。

4. 深度学习环境:Anaconda、PyTorch、YOLO、BEVFormer一条龙

聊到深度学习这边,环境配置的难度又上一个台阶。很多人第一次接触“环境配置”这个概念,其实就是从跑AI模型开始的。原因很直接:深度学习框架的依赖矩阵太复杂了——Python版本、CUDA版本、cuDNN版本、PyTorch版本、torchvision版本,任何一个不匹配都可能装完import torch直接报错。

4.1 conda虚拟环境:把深度学习依赖装进“小房间”

我跟团队里的同学说过一句话:做深度学习,谁不建conda虚拟环境,谁就是在给自己埋雷。因为深度学习项目对Python版本和框架版本极其敏感,今天跑通的代码,三个月后换台机器可能就起不来了。

最稳妥的流程是:先创建独立环境,再装PyTorch。

conda create -n yolov11 python=3.10 conda activate yolov11 pip install torch torchvision torchaudio

这里最关键的一步是:先确认你的机器有没有NVIDIA显卡,再决定装CPU版还是GPU版。很多人直接复制网上的安装命令,装完之后跑torch.cuda.is_available()返回False,然后一脸懵。其实这条命令应该在你装完PyTorch之后第一时间执行,它比任何教程都诚实——返回True说明环境配对成功,返回False就说明你要么装成了CPU版,要么CUDA驱动本身有问题。

给新手一个判断技巧:如果你的机器是普通办公笔记本,大概率没有独立NVIDIA显卡,那就老老实实装CPU版,跑一些小型模型一样能学;如果是有NVIDIA显卡的机器,先看显卡驱动支持的CUDA版本,再去PyTorch官网选对应版本安装。不要为了“GPU版听起来高级”就硬装,装完用不起来更打击信心。

4.2 YOLOv11(ultralytics)环境配置实操

目标检测方向,YOLO系列应该是被搜得最勤的。以ultralytics库为例,它的环境配置其实是目前深度学习里少见的“对小白友好”的流程:

conda create -n yolov11 python=3.10 conda activate yolov11 pip install ultralytics

装完之后,不用急着跑训练,先跑一个最简单的验证:

yolo predict model=yolov11n.pt source='https://ultralytics.com/images/bus.jpg'

能正常下载模型、跑出一张带检测框的图,整个环境就通了。接下来才是按自己的数据去调配置。我这个顺序是故意的——先让新手用最少步骤获得一次正反馈,再去啃数据集、训练参数那些更复杂的部分。很多人一上来就想着配训练环境,结果卡在数据集标注路径上,半天看不到一次成功跑通的图片,很容易放弃。

不过这里还是有两个高频坑:一个是ultralytics依赖torch,你必须确保装的是跟CUDA匹配的版本,否则训练时明明在GPU服务器上,却慢得像在跑CPU;另一个是如果你同时跑其他项目,别在同一个conda环境里一会儿升torch一会儿降torch,版本一回退,之前能跑的代码可能就全废了。

4.3 BEVFormer这类科研向仓库:为什么按README配也会报错

如果说YOLO是“标准模板”,那BEVFormer这类学术仓库就是把环境配置的难度拉满了。BEVFormer是自动驾驶领域经典的BEV感知模型,它的环境配置真相是:README给出的是“理想状态下的配置”,实际配起来经常要面对版本地狱——mmcv要跟pytorch的版本严格对齐,mmdetection3d、mmsegmentation又有各自的依赖,哪怕装错一个小版本,编译时都能报出让人看不懂的CUDA错误。

我的经验是,遇到这类仓库,不要上来就按README一步步执行。先读完后在项目issues里搜一下“environment”或“setup”关键词,看看别人踩了什么坑、提供了哪些补丁,往往比README本身更有用。然后动手配置时,严格用conda创建独立环境,并且在项目目录下装包时加-e参数,比如:

pip install -e .

这样源码和依赖处于“可编辑”状态,后面你改了某个模块的代码可以即时生效,不用重装一遍。最后,任何时候都要记住:这类仓库的配置过程本身就是项目的一部分,你花在配环境上的时间,别人也花过,不是你笨,是它确实复杂。

5. 工程与移动端:Nginx多站点域名配置、ADB一键化的进阶玩法

前面聊的都是“让某个语言/框架跑起来”,这一章聊的是“让多个服务在同一台机器/虚拟机里协同工作”。这类配置不像单个语言环境那样有标准答案,每个团队的拓扑都不一样,但底层思路通用。

5.1 本地+虚拟机多端口Nginx多站点自定义域名配置

先描述一下这个场景:你本地开发机跑着前端服务(可能占着8080),虚拟机里跑着后端服务(也可能占着8080),两边都要开发、都要调试,直接用IP+端口去访问很容易混,于是想给每个项目配一个自定义域名,比如project1.local、project2.local。

第一步:改hosts文件,让自定义域名指向本机或虚拟机的IP。Windows在C:\Windows\System32\drivers\etc\hosts,Linux/macOS在/etc/hosts。加一行:

127.0.0.1 project1.local 192.168.56.101 project2.local

第二步:给每个Nginx站点写一个独立的server配置。核心思想是:不同端口可以监听不同服务,同一端口可以靠server_name区分站点。比如本地Nginx同时监听8081和8082两个端口,前者配给前端,后者配给后端:

server { listen 8081; server_name project1.local; location / { proxy_pass http://127.0.0.1:3000; } } server { listen 8082; server_name project2.local; location / { proxy_pass http://192.168.56.101:8000; } }

第三步:nginx -t校验配置文件语法,然后nginx -s reload重载,浏览器访问http://project1.local:8081即可。

这里面最容易被忽略的是hosts解析生效问题。改完hosts后,部分系统或浏览器有缓存,可能需要刷新DNS(ipconfig /flushdns)或重启浏览器才能生效。另外一个常见坑是:虚拟机里的进程监听的是127.0.0.1而不是0.0.0.0,导致外部机器永远访问不到。给虚拟机做服务调试时,启动参数里记得绑定0.0.0.0。这一类“看起来是域名配置问题,实际是监听地址问题”的情况,我至少帮人排查过十几次。

5.2 ADB环境一键配置:把重复劳动写成脚本

ADB(Android Debug Bridge)是安卓开发和自动化测试绕不开的工具。配置ADB本身不难:下载platform-tools,把目录加进Path,验证adb version。但“一键配置”这个需求,反映的是另一个问题——环境配置是重复劳动,完全可以脚本化。

Windows下写一个简单的批处理脚本,内容就是自动检测当前目录下的platform-tools,然后把它写进用户级的Path:

@echo off set PLATFORM_TOOLS=%cd%\platform-tools setx PATH "%PATH%;%PLATFORM_TOOLS%" echo ADB environment configured. adb version

运行一次之后重开命令行,adb直接可用。这个思路可以推广到任何“下载即用”型的工具:与其每次手动去系统设置里点半天,不如让脚本帮你改环境变量。我强烈建议每个开发者都学一点批处理(Windows)或Shell(macOS/Linux)脚本的基础语法,环境配置这个痛点,脚本化之后至少能省掉一半时间。

6. 把“反复搜环境配置”变成“一次配好”的方法论

讲完这么多具体场景,最后沉淀一下底层方法论。你会发现,不管配什么环境,翻来覆去其实就那么几件事:PATH、版本管理器、环境隔离、验证命令。把这四件事吃透,你就不再是“搜一个抄一个”,而是遇到新环境也能自己推。

6.1 PATH是什么:环境配置百分之八十的谜团都在这

前面反复提到“加进Path”,那PATH到底是什么?一句话解释:它是操作系统维护的一个“找命令的搜索列表”。你在命令行敲python时,系统会按PATH里列出的顺序,挨个目录找python.exe。找到就执行,找不到就报“不是内部或外部命令”。

理解了这一点,很多谜团就解开了:为什么明明装了Python却在命令行找不到?——因为Python安装时的“Add to PATH”你没勾。为什么java -version显示的版本跟你装的不一样?——因为PATH里旧版本的目录排在了新版本前面。为什么改完环境变量不生效?——因为所有已打开的终端窗口,是在打开时读取的环境变量,改完必须开新窗口。

从“背步骤”变成“理解机制”之后,你再遇到任何“命令不识别”,第一反应应该是:where 命令名或which 命令名,看看系统到底找到了谁、没找到谁。这个排查动作,比重新百度“xxx环境配置”高效得多。

6.2 配置记录与回滚:给自己写一份“环境README”

每配好一个环境,我强烈建议你顺手把配置过程记成一份README,放在项目仓库里。记什么呢?不需要长篇大论,只要几行:操作系统版本、关键软件精确版本号(比如Python 3.10.11而不是“Python 3”)、安装方式、安装路径、需要修改哪些环境变量、验证命令。以后换新机器,照着这份README能少走一半弯路;以后出问题要排查,版本清晰也知道从哪查起。

这件事的灵感其实来自一个痛苦的教训:以前我帮人配过一次复杂环境,花了整整一个下午把所有依赖都调通了,但没记录。三个月后那人换电脑,问我“当时是怎么配的”,我对着历史聊天记录拼了半天也没能完全复现——因为当时试了好几个版本才成功,最终路径已经记不清了。从那之后,我给自己立了规矩:任何超过30分钟的配置过程,必须留一份简洁的环境说明文档。这个习惯也让我在团队里“配置问题找我”的名声越来越大,其实不是我厉害,是文档给了我底气。

6.3 报错速查:高频错误与解决思路

最后整理一张高频报错速查表,覆盖前面几条主线里最常见的错误。这张表不是让你背答案,而是让你建立一种“报错信息是在跟你说话”的感知。

报错信息片段常见原因解决思路
'java' 不是内部或外部命令JAVA_HOME或Path没配好检查JAVA_HOME路径、Path中是否包含%JAVA_HOME%\bin,重开命令行
No module named 'torch'Python解释器选错或未装包确认终端里conda activate了哪个环境,检查VSCode/PyCharm的解释器路径
gcc: command not foundUbuntu下未装build-essentialsudo apt install build-essential
error: command 'gcc' failed编译依赖缺失安装对应开发包或Visual Studio Build Tools
无法加载DLL运行库缺失或版本不符C++场景装VC运行库,深度学习场景检查CUDA/cuDNN版本对齐
EADDRINUSE端口被占用netstat -ano查占用进程,换端口或杀进程
ModuleNotFoundError: mmcvmmcv与pytorch版本不匹配遵循mmcv官方版本对照表重新装
Permission deniedLinux下无写权限检查文件所有者,对用户目录用sudo chown调整

看到报错先别慌,把第一行错误信息完整读一遍,再查你的版本信息。八成以上的问题不是“玄学”,就是版本不对齐或者路径没找对。我这里特意没有给“万能解决方案”,因为环境配置的真谛就是:理解自己在做什么,而不是等待一条魔法命令。

最后再讲一个我个人的小习惯:每次配好一个环境,我会顺手起一个最简单的验证程序跑一遍——Java就hello world,深度学习就跑一次torch.cuda.is_available(),C/C++就编译并运行一个hello.c。这个“最小验证”看起来多余,却能区分“环境真的好了”和“我感觉它好了”。很多项目跑不起来,其实环境从来没配通过,只是一路稀里糊涂地往下走,最后在一个不相干的报错里爆发出来。环境配置这件事,最大的捷径就是:每完成一步,就验证一步;每配完一个栈,就留一份文档。做到这两点,“环境配置kkkk”的崩溃时刻,会越来越少。

返回列表