Django+Vue项目打包部署脚本包括Django端收集Python包并用pip3安装、拷贝发布路径,Vue端安装node_modules依赖并执行npmrunbuild打包。主打包脚本整合各模块,Python包提前下载至统一目录,通过package.sh脚本安装,涉及临时文件创建、版本号设置及生成可执行文件。
最近在搞项目部署,写一个项目打包执行脚本,结果踩了不少坑。这里先把整体思路梳理出来,后面会更新 .sh 脚本的具体写法和一些细节问题。

长期稳定更新的攒劲资源: >>>点此立即查看<<<
1.主打包脚本 /sus/packet_bin_linux:
#!/bin/bash if [ ! -d "../../10-common/version/release/linux/sus" ]; then mkdir ../../10-common/version/release/linux/sus fi # packet susmgr echo "begin packet susmgr.. " cd susmgr chmod +x package.sh ./package.sh cd .. # packet sussrv_py echo "begin packet sussrv_py.. " cd sussrv_py chmod +x package.sh ./package.sh cd .. # packet sussrv rm -rf sus rm -f sus.tgz mkdir sus cp -f sussrv/prj_linux/sus sus/sus if [ $? != 0 ] then echo " sus was not copied.. " fi cp -rf sussrv/prj_linux/conf sus/ cp -rf sussrv/prj_linux/shells sus/ tar -czf sus.tgz sus cat sussrv/prj_linux/install.sh sus.tgz > sus.bin mv sus.bin ../../10-common/version/release/linux/sus cp sussrv/prj_linux/sus ../../10-common/version/release/linux/sus rm -rf sus
其中 # packet susmgr 是启动 susmgr 模块的启动脚本 package.sh。
2.susmgr 模块启动打包脚本 /sus/susmgr/package.sh:
#!/bin/bash
version=6.0.0.4.0
myDate="${version}-`date '+%Y%m%d%H%M'`"
mkdir -p .files_temp/
ls build
cp -a build .files_temp/
mkdir -p .files_temp/build/susmgr
ls | grep -v ".files_temp" | grep -v "release" | xargs -i cp -a {} .files_temp/build/susmgr
cp -a ../../../10-common/version/release/linux/python/certifi-2019.11.28-py2.py3-none-any.whl .files_temp/build/python3/package/
cp -a ../../../10-common/version/release/linux/python/chardet-3.0.4-py2.py3-none-any.whl .files_temp/build/python3/package/
cp -a ../../../10-common/version/release/linux/python/django_conn_pool-2.0.3-py3-none-any.whl .files_temp/build/python3/package/
cp -a ../../../10-common/version/release/linux/python/django_cors_headers-3.0.2-py2.py3-none-any.whl .files_temp/build/python3/package/
cp -a ../../../10-common/version/release/linux/python/django_redis-4.10.0-py2.py3-none-any.whl .files_temp/build/python3/package/
cp -a ../../../10-common/version/release/linux/python/Django-2.1.4-py3-none-any.whl .files_temp/build/python3/package/
cp -a ../../../10-common/version/release/linux/python/djangorestframework-3.9.4-py2.py3-none-any.whl .files_temp/build/python3/package/
cp -a ../../../10-common/version/release/linux/python/hiredis-1.0.0-cp35-cp35m-manylinux1_x86_64.whl .files_temp/build/python3/package/
cp -a ../../../10-common/version/release/linux/python/idna-2.8-py2.py3-none-any.whl .files_temp/build/python3/package/
cp -a ../../../10-common/version/release/linux/python/lupa-1.8-cp35-cp35m-manylinux1_x86_64.whl .files_temp/build/python3/package/
cp -a ../../../10-common/version/release/linux/python/pbr-5.4.3-py2.py3-none-any.whl .files_temp/build/python3/package/
cp -a ../../../10-common/version/release/linux/python/PyMySQL-0.9.3-py2.py3-none-any.whl .files_temp/build/python3/package/
cp -a ../../../10-common/version/release/linux/python/python_dateutil-2.8.0-py2.py3-none-any.whl .files_temp/build/python3/package/
cp -a ../../../10-common/version/release/linux/python/pytz-2019.1-py2.py3-none-any.whl .files_temp/build/python3/package/
cp -a ../../../10-common/version/release/linux/python/setuptools-42.0.2-py2.py3-none-any.whl .files_temp/build/python3/package/
cp -a ../../../10-common/version/release/linux/python/six-1.12.0-py2.py3-none-any.whl .files_temp/build/python3/package/
cp -a ../../../10-common/version/release/linux/python/SQLAlchemy-1.3.8.tar.gz .files_temp/build/python3/package/
cp -a ../../../10-common/version/release/linux/python/sqlparse-0.3.0-py2.py3-none-any.whl .files_temp/build/python3/package/
cp -a ../../../10-common/version/release/linux/python/stevedore-1.31.0-py2.py3-none-any.whl .files_temp/build/python3/package/
cp -a ../../../10-common/version/release/linux/python/requests-2.22.0-py2.py3-none-any.whl .files_temp/build/python3/package/
cp -a ../../../10-common/version/release/linux/python/uwsgi-2.0.18.tar.gz .files_temp/build/python3/package/
# python3 模块打包
cd .files_temp/build/python3/
PACKAGE_PATH=$(pwd)
./package.sh ${PACKAGE_PATH}
rm -rf package
zip -r susmgr_python3.zip susmgr_python3/
rm -rf susmgr_python3
cd -
# 前端打包
cd .files_temp/build
dist_path=$(pwd)/susmgr/susweb
./susweb/package.sh ${dist_path}
cd -
# 后端打包
cd .files_temp/build/
echo ${myDate} > susmgr/version
zip -r susmgr.zip susmgr/
rm -rf susmgr
cd -
#make susmgr.bin
cd .files_temp
chmod +x build/install.sh
makeself.sh build/ susmgr.bin "Installing susmgr_client..." ./install.sh
cd -
cp -a .files_temp/susmgr.bin ../../../10-common/version/release/linux/sus/susmgr.bin
rm -rf .files_temp
一个值得注意的地方是:我们把项目用到的 Python 包提前下载好,拷贝到统一管理的目录 /10-common/version/release/linux/python 下,通过这种方式来收集 Python 库。
3.接着安装搜集的库,执行脚本 /sus/susmgr/build/python3/package.sh:
#!/bin/bash
PYTHON_PATH=/opt/midware/python3
export LC_ALL="en_US.UTF-8"
pythonpath=$1/susmgr_python3
mkdir -p ${pythonpath}/lib/python3.5/site-packages
export PYTHONPATH=${pythonpath}/lib/python3.5/site-packages
INSTALL="--prefix=${pythonpath}"
package_list=`${PYTHON_PATH}/bin/pip3 list`
if [[ ${package_list} =~ "certifi" ]];then
:
else
${PYTHON_PATH}/bin/pip3 install package/certifi-2019.11.28-py2.py3-none-any.whl ${INSTALL}
fi
if [[ ${package_list} =~ "chardet" ]];then
:
else
${PYTHON_PATH}/bin/pip3 install package/chardet-3.0.4-py2.py3-none-any.whl ${INSTALL}
fi
if [[ ${package_list} =~ "PyMySQL" ]];then
:
else
${PYTHON_PATH}/bin/pip3 install package/PyMySQL-0.9.3-py2.py3-none-any.whl ${INSTALL}
fi
if [[ ${package_list} =~ "pytz" ]];then
:
else
${PYTHON_PATH}/bin/pip3 install package/pytz-2019.1-py2.py3-none-any.whl ${INSTALL}
fi
if [[ ${package_list} =~ "sqlparse" ]];then
:
else
${PYTHON_PATH}/bin/pip3 install package/sqlparse-0.3.0-py2.py3-none-any.whl ${INSTALL}
fi
if [[ ${package_list} =~ "Django" ]];then
:
else
${PYTHON_PATH}/bin/pip3 install package/Django-2.1.4-py3-none-any.whl ${INSTALL}
fi
if [[ ${package_list} =~ "django_cors_headers" ]];then
:
else
${PYTHON_PATH}/bin/pip3 install package/django_cors_headers-3.0.2-py2.py3-none-any.whl ${INSTALL}
fi
if [[ ${package_list} =~ "django_conn_pool" ]];then
:
else
${PYTHON_PATH}/bin/pip3 install package/django_conn_pool-2.0.3-py3-none-any.whl ${INSTALL}
fi
if [[ ${package_list} =~ "django_redis" ]];then
:
else
${PYTHON_PATH}/bin/pip3 install package/django_redis-4.10.0-py2.py3-none-any.whl ${INSTALL}
fi
if [[ ${package_list} =~ "djangorestframework" ]];then
:
else
${PYTHON_PATH}/bin/pip3 install package/djangorestframework-3.9.4-py2.py3-none-any.whl ${INSTALL}
fi
if [[ ${package_list} =~ "hiredis" ]];then
:
else
${PYTHON_PATH}/bin/pip3 install package/hiredis-1.0.0-cp35-cp35m-manylinux1_x86_64.whl ${INSTALL}
fi
if [[ ${package_list} =~ "idna" ]];then
:
else
${PYTHON_PATH}/bin/pip3 install package/idna-2.8-py2.py3-none-any.whl ${INSTALL}
fi
if [[ ${package_list} =~ "lupa" ]];then
:
else
${PYTHON_PATH}/bin/pip3 install package/lupa-1.8-cp35-cp35m-manylinux1_x86_64.whl ${INSTALL}
fi
if [[ ${package_list} =~ "pbr" ]];then
:
else
${PYTHON_PATH}/bin/pip3 install package/pbr-5.4.3-py2.py3-none-any.whl ${INSTALL}
fi
if [[ ${package_list} =~ "PyMySQL" ]];then
:
else
${PYTHON_PATH}/bin/pip3 install package/PyMySQL-0.9.3-py2.py3-none-any.whl ${INSTALL}
fi
if [[ ${package_list} =~ "six" ]];then
:
else
${PYTHON_PATH}/bin/pip3 install package/six-1.12.0-py2.py3-none-any.whl ${INSTALL}
fi
if [[ ${package_list} =~ "python_dateutil" ]];then
:
else
${PYTHON_PATH}/bin/pip3 install package/python_dateutil-2.8.0-py2.py3-none-any.whl ${INSTALL}
fi
if [[ ${package_list} =~ "setuptools" ]];then
:
else
${PYTHON_PATH}/bin/pip3 install package/setuptools-42.0.2-py2.py3-none-any.whl ${INSTALL}
fi
if [[ ${package_list} =~ "django-cors-headers" ]];then
:
else
${PYTHON_PATH}/bin/pip3 install django_cors_headers-3.0.2-py2.py3-none-any.whl ${INSTALL}
fi
if [[ ${package_list} =~ "SQLAlchemy" ]];then
:
else
${PYTHON_PATH}/bin/pip3 install package/SQLAlchemy-1.3.8.tar.gz ${INSTALL}
fi
if [[ ${package_list} =~ "stevedore" ]];then
:
else
${PYTHON_PATH}/bin/pip3 install package/stevedore-1.31.0-py2.py3-none-any.whl ${INSTALL}
fi
if [[ ${package_list} =~ "requests" ]];then
:
else
${PYTHON_PATH}/bin/pip3 install package/requests-2.22.0-py2.py3-none-any.whl ${INSTALL}
fi
if [[ ${package_list} =~ "uWSGI" ]];then
:
else
cd package
tar -zxf uwsgi-2.0.18.tar.gz
cd uwsgi-2.0.18
sed -i 's/^xml.*$/xml = false/g' buildconf/base.ini
${PYTHON_PATH}/bin/python3 setup.py install ${INSTALL}
cd ..
rm -rf uwsgi-2.0.18
cd ..
fi
3.进行前端打包,执行脚本 /sus/susmgr/build/susweb/package.sh:
#!/bin/bash -x PS4='$(date "+%s.%N ($LINENO) + ")' cd $1 WORK=$(pwd) rm -rf node_modules* rm -rf node-v8.11.2-linux-x64* cp -a ../../../../../../../10-common/version/release/linux/vue/node_modules.tar ./ cp -a ../../../../../../../10-common/version/release/linux/vue/node-v8.11.2-linux-x64.tar ./ tar -xf node-v8.11.2-linux-x64.tar tar -xf node_modules.tar export PATH=$PATH:$WORK/node-v8.11.2-linux-x64/bin npm install npm run build rm -rf node_modules* rm -rf node-v8.11.2-linux-x64* cd -
4.执行生成 .bin 包脚本 /sus/susmgr/build/install.sh:
#!/bin/bash
BASE_PATH=/opt/mcu/susmgr
mkdir -p /opt/log/susmgr
mkdir -p /opt/data/susmgr
mkdir -p $BASE_PATH
# susmgr_python3
rm -rf ${BASE_PATH}/susmgr_python3
unzip -d ${BASE_PATH}/ python3/susmgr_python3.zip
# susmgr
rm -rf ${BASE_PATH}/susmgr
unzip -d ${BASE_PATH}/ susmgr.zip
# 复制shells文件
rm -rf ${BASE_PATH}/shells
cp -a ${BASE_PATH}/susmgr/shells ${BASE_PATH}/
chmod 0755 ${BASE_PATH}/shells/*
shells 文件夹里放的是启动和停止 uwsgi 服务的脚本:

最后把生成的 bin 包拷贝到发布路径,执行 .bin 文件就可以一键安装启动服务了。整个流程跑下来,比手动一步步操作高效得多,也避免了环境不一致的问题。希望这个思路和脚本细节能对做类似部署的朋友有所帮助。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述