ubuntu 18.04 编译安装flexpart 10.4(2023年) —— 筑梦之路

2023年10月29日

环境说明

操作系统版本:ubuntu  18.04

python版本:3.6.9

gcc版本:7.5.0

编译安装路径:/usr/local

cmake: 3.10.2

所需要的源码包我已经打包放到我的资源。

2021年1月份已经写过一篇Ubuntu 编译安装的帖子FLEXPART安装配置笔记(成功案例)——筑梦之路_筑梦之路的博客-CSDN博客

也遇到比较多的网友来咨询在编译安装过程中的问题,因此今天再次整理一下编译安装的过程,顺便解决之前写的不是很明确的地方,欢迎大家交流指正。

准备编译工作

# 更新软件源
sudo apt-get update# 安装编译工具和依赖包
sudo apt-get install -y g++ gfortran autoconf libtool automake flex bison cmake python3-dev python3-pip git vim curl unzip build-essential libbz2-dev libssl-dev libreadline-dev libsqlite3-dev tk-dev ruby# 安装python相关包sudo apt-get install -y python3 python3-eccodes python3-genshi python3-numpy gfortran fftw3-dev libeccodes-dev libemos-dev# 配置pip显示的格式sudo mkdir ~/.pipsudo cat > ~/.pip/pip.conf << EOF
[list]
format=columns
EOF# 建立软链接sudo ln -sf /usr/bin/python3 /usr/bin/python
sudo ln -sf /usr/bin/pip3 /usr/bin/pip# 检查sudo python -V
sudo pip -V

 准备python环境

# 安装pip的包sudo pip3 install cdsapi ecmwf-api-client eccodes==1.6.1 -i https://pypi.douban.com/simple#检查是否安装成功sudo python3 -c "import eccodes; print(eccodes.__version__)"
sudo python3 -c "import genshi; print(genshi.__version__)"
sudo python3 -c "import numpy; print(numpy.__version__)"
sudo pip3 list | grep cdsapi | awk '{print $2}'
sudo python3 -c "import ecmwfapi; print(ecmwfapi.__version__)"

编译安装

1. 编译安装jasper

# 下载源码包wget -c http://www.ece.uvic.ca/~mdadams/jasper/software/jasper-1.900.1.zip# 解压文件到指定目录unzip jasper-1.900.1.zip -d /usr/local/# 新建目录mkdir -p /usr/local/jasper# 切换目录cd /usr/local/jasper-1.900.1# 配置CFLAGS="-fPIC" ./configure --prefix=/usr/local/jasper# 编译
make# 编译检查
make check# 安装
make install

2. 编译安装grib_api

# 下载源码wget -c https://people.freebsd.org/~sunpoet/sunpoet/grib_api-1.28.0-Source.tar.gz# 解压到指定目录tar -zxvf grib_api-1.28.0-Source.tar.gz -C /usr/local/# 创建目录mkdir -p /usr/local/grib_api# 切换目录cd /usr/local/grib_api-1.28.0-Source# 编译三部曲./configure --prefix=/usr/local/grib_api --with-jasper=/usr/local/jaspermakemake checkmake install

3. 编译安装eccodes

# 下载源码wget -c  https://confluence.ecmwf.int/download/attachments/45757960/eccodes-2.7.3-Source.tar.gz?api=v2# 解压源码到指定目录tar xvzf eccodes-2.7.3-Source.tar.gz -C /usr/local/# 创建目录mkdir -p /usr/local/eccodes# 切换目录cd /usr/local/eccodes-2.7.3-Source# 编译三部曲mkdir build && cd buildcmake -DCMAKE_INSTALL_PREFIX=/usr/local/eccodes /usr/local/eccodes-2.7.3-Source -DPYTHON_EXECUTABLE=/usr/bin/python3makectestmake install# 配置环境变量cat >> /etc/profile << 'EOF'
export ECCODES_SAMPLES_PATH=$PATH:/usr/local/eccodes/share/eccodes/samples
export ECCODES_DEFINITION_PATH=$PATH:/usr/local/eccodes/share/eccodes/definitions
EOFsource /etc/profile# 检查验证sudo apt-get install libeccodes-dev
python3 -m eccodes selfcheck# 正常输出如下:
Found: ecCodes v2.6.0.
Your system is ready.

4. 编译安装zlib

# 下载源码v=1.2.8  sudo wget http://www.zlib.net/fossils/zlib-${v}.tar.gz# 解压到指定目录sudo tar -xf zlib-${v}.tar.gz -C /usr/local/ && cd /usr/local/zlib-${v}# 编译三部曲sudo ./configure --prefix=/usr/localsudo make && make install

5. 编译安装 szlib

# 下载源码v=2.1
wget http://sources.buildroot.net/szip/szip-${v}.tar.gz# 解压到指定目录tar -xf szip-${v}.tar.gz -C /usr/local/cd /usr/local/szip-${v} && mkdir -p /usr/local/szip# 编译三部曲./configure --prefix=/usr/local/szip
make
make install

6. 编译安装hdf5

# 下载源码v=1.8.13wget https://www.gfd-dennou.org/arch/ucar/netcdf/netcdf-4/hdf5-${v}.tar.gz# 解压到指定目录tar -xf hdf5-${v}.tar.gz -C /usr/local/ && cd /usr/local/hdf5-${v}# 设置变量prefix="/usr/local/hdf5-$v"echo "Add HDF5_DIR=$prefix to .bashrc"echo "" >> ~/.bashrcecho "# HDF5 libraries for python" >> ~/.bashrcecho export HDF5_DIR=$prefix  >> ~/.bashrc# 编译三部曲./configure --enable-shared --enable-hl --prefix=$HDF5_DIRmake -j 2              # 2 for number of procs to be usedmake install

7. 编译安装netcdf-c

# 下载源码v=4.1.3wget https://www2.mmm.ucar.edu/wrf/OnLineTutorial/compile_tutorial/tar_files/netcdf-${v}.tar.gz# 解压到指定目录tar -xf netcdf-${v}.tar.gz -C /usr/local/ && cd /usr/local/netcdf-${v}# 设置变量prefix="/usr/local/"echo "Add NETCDF4_DIR=$prefix to .bashrc"
echo "" >> ~/.bashrc
echo "# NETCDF4 libraries for python" >> ~/.bashrc
echo export NETCDF4_DIR=$prefix  >> ~/.bashrc# 编译三部曲CPPFLAGS=-I$HDF5_DIR/include LDFLAGS=-L$HDF5_DIR/lib ./configure --enable-netcdf-4 --enable-shared --enable-dap --prefix=$NETCDF4_DIRmake 
make install

8. python Netcdf4 安装

# install python's netCDF4sudo pip3 install cftime==1.3.1 -i https://pypi.douban.com/simplesudo pip3 install numpy==1.19.4 -i https://pypi.douban.com/simplesudo pip3 install netCDF4==1.5.5.1 -i https://pypi.douban.com/simplesudo python3 -c "import netCDF4;print(netCDF4.__version__)"

9. 编译安装FLEXPART10.4

# 下载源码wget -c https://www.flexpart.eu/downloads/66# 解压到指定目录tar -xvf 66 -C /usr/local/ # 切换目录cd /usr/local/flexpart_v10.4_3d7eebf# 备份src目录cp -r src src-backup-`date +%F`# 修改makefile文件vim makefile#### 修改第一处#modified to 64-73行ROOT_DIR = /usr/localF90       = /usr/bin/gfortranMPIF90    = /usr/bin/mpifortINCPATH1  = ${ROOT_DIR}/grib_api/includeINCPATH2  = ${ROOT_DIR}/jasper/includeINCPATH3 = /includeLIBPATH1 = ${ROOT_DIR}/grib_api/libLIBPATH2 = ${ROOT_DIR}/jasper/libLIBPATH3 = /lib#### 修改第二处### Enable netCDF output?
ifeq ($(ncf), yes)NCOPT = -DUSE_NCF -lnetcdff -lnetcdf
elseNCOPT = -UUSE_NCF
endif#### 修改第三处## LIBRARIES
LIBS = -lgrib_api_f90 -lgrib_api -lm -ljasper $(NCOPT) -lnetcdffFFLAGS   = -I$(INCPATH1) -I$(INCPATH2) -I$(INCPATH3) -O$(O_LEV) -g -cpp -m64 -mcmodel=medium -fconvert=little-endian -frecord-marker=4 -fmessage-length=0 -flto=jobserver -O$(O_LEV) $(NCOPT) $(FUSER)  #-Warray-bounds -fcheck=all # -march=nativeDBGFLAGS = -I$(INCPATH1) -I$(INCPATH2) -I$(INCPATH3) -O$(O_LEV_DBG) -g3 -ggdb3 -cpp -m64 -mcmodel=medium -fconvert=little-endian -frecord-marker=4 -fmessage-length=0 -flto=jobserver -O$(O_LEV_DBG) $(NCOPT) -fbacktrace   -Wall  -fdump-core $(FUSER)  #  -ffpe-trap=invalid,overflow,denormal,underflow,zero  -Warray-bounds -fcheck=allLDFLAGS  = $(FFLAGS) -L$(LIBPATH1) -Wl,-rpath,$(LIBPATH1) $(LIBS) -L$(LIBPATH2) -L$(LIBPATH3)
LDDEBUG  = $(DBGFLAGS) -L$(LIBPATH1) $(LIBS) -L$(LIBPATH2) -L$(LIBPATH3)# 编译make ncf=yes# 配置环境变量
cat >> /etc/profile <<'EOF'
export LD_LIBRARY_PATH=/usr/local/grib_api/lib:$LD_LIBRARY_PATH
EOFsource /etc/profile

10. 准备安装flex_extract

# 拉取源码cd /usr/localgit clone --single-branch --branch master https://www.flexpart.eu/gitmob/flex_extract

1)编译安装zlib 1.2.9


# 下载zlib 1.2.9源码,编译安装zlib 1.2.9版本wget https://sourceforge.net/projects/libpng/files/zlib/1.2.9/zlib-1.2.9.tar.gz# 解压到指定目录tar -zxvf zlib-1.2.9.tar.gz -C /usr/localcd /usr/local/zlib-1.2.9# 编译三部曲./configure; make; make install# 创建软链接ln -s -f /usr/local/lib/libz.so.1.2.9 /lib/x86_64-linux-gnu/libz.so.1

2) 编译安装emoslib

# 下载源码wget https://confluence.ecmwf.int/download/attachments/3473472/libemos-4.5.9-Source.tar.gz# 创建目录mkdir /usr/local/emoslib# 解压到指定目录tar -xzf libemos-4.5.9-Source.tar.gz -C /usr/local/# 切换目录cd /usr/local/libemos-4.5.9-Source# 编译安装mkdir build ; cd build 
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local/emoslib /usr/local/libemos-4.5.9-Source
make
make install

3)安装ECMWF 与ERA5安装权限

cat > ~/.ecmwfapirc <<EOF
{"url"   : "https://api.ecmwf.int/v1","key"   : "8fb37b516ba233bde068613a8f08c785","email" : "791653827@qq.com"
}
EOFcat > ~/.cdsapirc <<EOF
url: {api-url}
key: {uid}:{api-key}
EOF

4) 修改makefile_local_gfortran文件

# 切换目录cd /usr/local/flex_extract/Source/Fortran/# 修改文件vim makefile_local_gfortran# change the original path of ECCODES_INCLUDE_DIR to 
ECCODES_INCLUDE_DIR=/usr/include

5) 执行安装flex_extract

# 切换目录cd /usr/local/flex_extract# 执行安装./setup_local.sh#成功结果输出如下内容WARNING: installdir has not been specified
flex_extract will be installed in here by compiling the Fortran source in /usr/local/flex_extract/Source/Fortran
Install flex_extract_v7.1.2 software at local in directory /usr/local/flex_extractUsing makefile: makefile_local_gfortran
gfortran   -O3  -Bstatic -leccodes_f90 -leccodes -Bdynamic -lm  -lemosR64 -I. -I/usr/include -fdefault-real-8 -fopenmp -fconvert=big-endian   -c	./rwgrib2.f90
gfortran   -O3  -Bstatic -leccodes_f90 -leccodes -Bdynamic -lm  -lemosR64 -I. -I/usr/include -fdefault-real-8 -fopenmp -fconvert=big-endian   -c	./phgrreal.f90
gfortran   -O3  -Bstatic -leccodes_f90 -leccodes -Bdynamic -lm  -lemosR64 -I. -I/usr/include -fdefault-real-8 -fopenmp -fconvert=big-endian   -c	./grphreal.f90
gfortran   -O3  -Bstatic -leccodes_f90 -leccodes -Bdynamic -lm  -lemosR64 -I. -I/usr/include -fdefault-real-8 -fopenmp -fconvert=big-endian   -c	./ftrafo.f90
gfortran   -O3  -Bstatic -leccodes_f90 -leccodes -Bdynamic -lm  -lemosR64 -I. -I/usr/include -fdefault-real-8 -fopenmp -fconvert=big-endian   -c	./calc_etadot.f90
gfortran   -O3  -Bstatic -leccodes_f90 -leccodes -Bdynamic -lm  -lemosR64 -I. -I/usr/include -fdefault-real-8 -fopenmp -fconvert=big-endian   -c	./posnam.f90
gfortran  rwgrib2.o calc_etadot.o ftrafo.o grphreal.o posnam.o phgrreal.o -o calc_etadot_fast.out  -O3  -Bstatic -leccodes_f90 -leccodes -Bdynamic -lm  -lemosR64 -fopenmp
ln -sf calc_etadot_fast.out calc_etadotlrwxrwxrwx 1 root root 20 Oct 29 06:30 ./calc_etadot -> calc_etadot_fast.out

6)测试flex_extract 

# 测试flex_extractcd Testing/Installation/Calc_etadot
# execute the Fortran progam without arguments
../../../Source/Fortran/calc_etadot#成功结果展示:
STATISTICS:          98842.4598  98709.7359   5120.5385
STOP SUCCESSFULLY FINISHED calc_etadot: CONGRATULATIONS

至此,已经全部编译安装完成,并测试成功。

这里附上python包的版本信息,以供各位参考:

# pip list
Package                Version            
---------------------- -------------------
asn1crypto             0.24.0             
attrs                  17.4.0             
Automat                0.6.0              
blinker                1.4                
cdsapi                 0.6.1              
certifi                2018.1.18          
cffi                   1.15.1             
cftime                 1.3.1              
chardet                3.0.4              
click                  6.7                
cloud-init             23.1.2             
colorama               0.3.7              
command-not-found      0.3                
configobj              5.0.6              
constantly             15.1.0             
cryptography           2.1.4              
distro-info            0.18ubuntu0.18.04.1
eccodes                1.6.1              
ecmwf-api-client       1.6.3              
findlibs               0.0.5              
Genshi                 0.7                
httplib2               0.9.2              
hyperlink              17.3.1             
idna                   2.6                
importlib-resources    5.4.0              
incremental            16.10.1            
Jinja2                 2.10               
jsonpatch              1.16               
jsonpointer            1.10               
jsonschema             2.6.0              
keyring                10.6.0             
keyrings.alt           3.0                
language-selector      0.1                
MarkupSafe             1.0                
netCDF4                1.5.5.1            
netifaces              0.10.4             
numpy                  1.19.5             
oauthlib               2.0.6              
PAM                    0.4.2              
pexpect                4.2.1              
pip                    9.0.1              
pyasn1                 0.4.2              
pyasn1-modules         0.2.1              
pycparser              2.21               
pycrypto               2.6.1              
pygobject              3.26.1             
PyJWT                  1.5.3              
pyOpenSSL              17.5.0             
pyserial               3.4                
python-apt             1.6.5+ubuntu0.7    
python-debian          0.1.32             
pyxdg                  0.25               
PyYAML                 3.12               
requests               2.18.4             
requests-unixsocket    0.1.5              
SecretStorage          2.3.1              
service-identity       16.0.0             
setuptools             39.0.1             
six                    1.11.0             
sos                    4.3                
ssh-import-id          5.7                
systemd-python         234                
tqdm                   4.64.1             
Twisted                17.9.0             
ubuntu-advantage-tools 27.2               
ufw                    0.36               
unattended-upgrades    0.1                
urllib3                1.22               
wheel                  0.30.0             
zipp                   3.6.0              
zope.interface         4.3.2

如果不关心flexpart的版本,可以直接使用apt-get命令安装

apt-get update  && apt-get install flexpart

 

相关源码包在我的资源或者通过文中链接地址下载。

注意事项:文中源码包的地址会随着时间过期,若不能下载请自行搜索相关版本文件。 

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

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

相关文章

电子器件 二极管

二极管主要是利用其单向导电性&#xff0c;通常用于整流、检波、限幅、元件保护等&#xff0c;在数字电路中常作为开关元件。 一、常用二极管类型 高频二极管 1N4148 等 肖特基二极管 SS14 SS34 SS54 等 快恢复二极管&#xff08;FRD&#xff09; 可以用快恢复二极管代替肖特…

YUV的红蓝颠倒(反色)的原因及解决

原因 UV排列反了。 比如说&#xff0c;NV21和YUV420SP的Y排列相同&#xff0c;UV则相反。给你YUV420SP&#xff0c;你当作NV21保存JPG&#xff0c;就会发生红蓝拿起。 解决办法 就是把UV互换一下。具体代码&#xff1a; NV21转YUV420SP的代码_nv21转yuv420格式-CSDN博客 …

【机器学习可解释性】4.SHAP 值

机器学习可解释性 1.模型洞察的价值2.特征重要性排列3.部分依赖图4.SHAP 值5.SHAP 值 高级使用 正文 理解各自特征的预测结果&#xff1f; 介绍 您已经看到(并使用)了从机器学习模型中提取一般解释技术。但是&#xff0c;如果你想要打破模型对单个预测的工作原理? SHAP 值…

C++模板编程和标准模板库(STL)

1、C模板编程 1&#xff09;函数模板 #include <iostream> using namespace std;// 声明一个泛型类型T&#xff0c;参数化数据类型 template <typename T> // 定义一个函数模板 T man(T a, T b) {return (a>b?a:b); }int main() {// 使用的时候没有指定参数类…

开源3D激光(视觉)SLAM算法汇总(持续更新)

原文连接 目录 一、Cartographer 二、hdl_graph_slam 三、LOAM 四、LeGO-LOAM 五、LIO-SAM 六、S-LOAM 七、M-LOAM 八、livox-loam 九、Livox-Mapping 十、LIO-Livox 十一、FAST-LIO2 十二、LVI-SAM 十三、FAST-Livo 十四、R3LIVE 十五、ImMesh 十六、Point-LIO 一、Cartograph…

canvas基础3 -- 交互

点击交互 使用 isPointInPath(x, y) 判断鼠标点击位置在不在图形内 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"&…

拿到 phpMyAdmin 如何获取权限

文章目录 拿到 phpMyAdmin 如何获取权限1. outfile 写一句话木马2. general_log_file 写一句话木马 拿到 phpMyAdmin 如何获取权限 1. outfile 写一句话木马 尝试使用SQL注入写文件的方式&#xff0c;执行 outfile 语句写入一句话木马。 select "<?php eval($_REQU…

电商独立站前端、后端、接口协议和电商API接口请求方式

前端是做什么的&#xff1f;后端是做什么的&#xff1f;哪些事情&#xff0c;是前端做的&#xff1f;哪些事情&#xff0c;是后端做的&#xff1f;前后端一体是什么意思&#xff1f;接口、接口协议、接口请求方式…… 1、前端所写的程序&#xff0c;主要运行在客户端&#xff…

postgresql14管理(六)-备份与恢复

定义 备份&#xff08;backup&#xff09;&#xff1a;通过物理复制或逻辑导出的方式&#xff0c;将数据库的文件或结构和数据拷贝到其他位置进行存储&#xff1b; 还原&#xff08;restore&#xff09;&#xff1a;是一种不完全的恢复。使用备份文件将数据库恢复到备份时的状…

项目|金额场景计算BigDecimal使用简记

前言 在实际项目开发中&#xff0c;我们经常会遇到一些金额计算&#xff0c;分摊等问题&#xff0c;通常我们都使用java.math.BigDecimal 来完成各种计算&#xff0c;避免使用浮点数float,double来计算金额&#xff0c;以免丢失精度&#xff0c;以下是博主部分使用场景和使用Bi…

[Docker]三.Docker 部署nginx,以及映射端口,挂载数据卷

一.Docker 部署 Nginx 以及端口映射 Docker 部署 Nginx,首先需要下载nginx镜像,然后启动这个镜像,就运行了一个nginx的容器了 1.下载 nginx 镜像并启动容器 #查看是否存在nginx镜像:发现没有nginx镜像 [rootlocalhost zph]# docker images | grep nginx#下载nginx镜像 [rootl…

【Spring】IOC容器与Bean的常用属性配置

文章目录 1.前言2.IOC容器2.1 BeanFactory 容器2.2 ApplicationContext 容器 3.Bean的常用属性配置4. 总结 1.前言 在之前的文章-IOC的快速入门中讲过Bean这个概念. 本来就来介绍容器与Bean的常用属性配置 在Spring框架中&#xff0c;Bean指的是被Spring加载生成出来的对象。 …

12、SpringCloud -- redis库存和redis预库存保持一致、优化后的压测效果

目录 redis库存和redis预库存保持一致问题的产生需求:代码:测试:优化后的压测效果之前的测试数据优化后的测试数据redis库存和redis预库存保持一致 redis库存是指初始化是从数据库中获取最新的秒杀商品列表数据存到redis中 redis的预库存是指每个秒杀商品每次成功秒杀之后…

永恒之蓝漏洞 ms17_010 详解

文章目录 永恒之蓝 ms 17_0101.漏洞介绍1.1 影响版本1.2 漏洞原理 2.信息收集2.1 主机扫描2.2 端口扫描 3. 漏洞探测4. 漏洞利用5.后渗透阶段5.1创建新的管理员账户5.2开启远程桌面5.3蓝屏攻击 永恒之蓝 ms 17_010 1.漏洞介绍 永恒之蓝&#xff08;ms17-010&#xff09;爆发于…

安装虚拟机(VMware)保姆级教程及配置虚拟网络编辑器和安装WindowsServer以及宿主机访问虚拟机和配置服务器环境

目录 一、操作系统 1.1.什么是操作系统 1.2.常见操作系统 1.3.个人版本和服务器版本的区别 1.4.Linux的各个版本 二、VMware Wworkstation Pro虚拟机的安装 1.下载与安装 注意&#xff1a;VMWare虚拟网卡 2.配置虚拟网络编辑器 三、安装配置 WindowsServer 1.创建虚拟…

自动化项目实战 [个人博客系统]

自动化博客项目 用户注册登录验证效验个人博客列表页博客数量不为 0 博客系统主页写博客 我的博客列表页效验 刚发布的博客的标题和时间查看 文章详情页删除文章效验第一篇博客 不是 "自动化测试" 注销退出到登录页面,用户名密码为空 用户注册 Order(1)Parameterized…

QT5.15在Ubuntu22.04上编译流程

在我们日常遇到的很多第三方软件中&#xff0c;有部分软件针对开发人员&#xff0c;并不提供预编译成果物&#xff0c;而是需要开发人员自行编译&#xff0c;此类问题有时候不是问题&#xff08;编译步骤的doc详细且清晰时&#xff09;&#xff0c;但有时候又很棘手&#xff08…

数据结构上机实验——二叉树的实现、二叉树遍历、求二叉树的深度/节点数目/叶节点数目、计算二叉树度为1或2的节点数、判断二叉树是否相似

文章目录 数据结构上机实验1.要求2.二叉树的实现2.1创建一颗二叉树2.2对这棵二叉树进行遍历2.3求二叉树的深度/节点数目/叶节点数目2.4计算二叉树中度为 1 或 2 的结点数2.5判断2棵二叉树是否相似&#xff0c;若相似返回1&#xff0c;否则返回0 3.全部源码测试&#xff1a;Bina…

问题 S: 一只小蜜蜂...(初始化dp)

1.注意点&#xff1a; 该题递推公式为斐波那契数列&#xff0c;而n达到50&#xff0c;是非常大的数 &#xff0c; 故应用循环代替递归&#xff0c;同时记录数据 同时用long long数组储存 ​​ 2.注意点&#xff1a;初始化起点&#xff0c;切忌重新递归找数 可以直接初始化所…

前端重新部署如何通知用户更新

标题解决方案 常用的webSocket解决方案 webSocket; 大致逻辑思考应该是前端在部署好后向服务器发送一个状态变更通知&#xff1b;服务器接收后主动向前端push&#xff1b;前端通过心跳检测&#xff0c;接收到相关更新时弹出提示&#xff0c;让用户确认更新&#xff1b; 缺点&a…