2022-12-18 00:15:55 +08:00

265 lines
9.5 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env bash
# 支持的环境变量:
# ZM_DOWN_PHP_VERSION php版本默认为8.0
# ZM_NO_LOCAL_PHP 如果填入任意内容则不检查本地PHP直接安装内建PHP仅限Linux
# ZM_TEMP_DIR 脚本下载内建PHP和Composer的临时目录默认为/tmp/.zm-runtime
# ZM_CUSTOM_DIR 自定义新建目录名称默认为zhamao-app
# ZM_COMPOSER_PACKAGIST 是否使用Composer的国外源默认使用国内阿里云如果设置并填写了内容则自动使用Composer的国外源
ZM_PWD=$(pwd)
_cyan="\033[0;36m"
_reset="\033[0m"
# 彩头
function nhead() {
if [ "$1" = "red" ]; then
echo -ne "\033[0;31m[!]"
elif [ "$1" = "yellow" ]; then
echo -ne "\033[0;33m[?]"
else
echo -ne "\033[0;32m[*]"
fi
echo -e "\033[0m"
}
# 下载文件 $1 到目录 $2自动选择使用 curl 或者 wget
function download_file() {
downloader="wget"
type wget >/dev/null 2>&1 || { downloader="curl"; }
if [ "$downloader" = "wget" ]; then
_down_prefix="O"
else
_down_prefix="o"
fi
_down_symbol=0
if [ ! -f "$2" ]; then
echo -ne "$(nhead) 正在下载 $1 ... "
$downloader "$1" -$_down_prefix "$2" >/dev/null 2>&1 && echo "完成!" && _down_symbol=1
else
echo "已存在!" && _down_symbol=1
fi
if [ $_down_symbol == 0 ]; then
echo "$(nhead red) 下载失败!请检查网络连接!"
rm -rf "$2"
return 1
fi
return 0
}
# 安装下载内建PHP
function install_native_php() {
ZM_PHP_VERSION="8.1"
if [ "$ZM_DOWN_PHP_VERSION" != "" ]; then
ZM_PHP_VERSION="$ZM_DOWN_PHP_VERSION"
fi
echo "$(nhead) 使用的内建 PHP 版本: $ZM_PHP_VERSION"
rm -rf "$ZM_TEMP_DIR"
mkdir "$ZM_TEMP_DIR" >/dev/null 2>&1
if [ ! -f "$ZM_TEMP_DIR/php" ]; then
download_file "https://dl.zhamao.xin/php-bin/down.php?php_ver=$ZM_PHP_VERSION&arch=$(uname -m)" "$ZM_TEMP_DIR/php.tgz" || return 1
tar -xf "$ZM_TEMP_DIR/php.tgz" -C "$ZM_TEMP_DIR/" && rm -rf "$ZM_TEMP_DIR/php.tgz"
fi
echo "$(nhead) 安装内建 PHP 完成!"
php_executable="$ZM_TEMP_DIR/php"
return 0
}
# 安装下载Composer
function install_native_composer() {
if [ ! -f "$ZM_TEMP_DIR/composer.phar" ]; then
# 下载 composer.phar
download_file "https://mirrors.aliyun.com/composer/composer.phar" "$ZM_TEMP_DIR/composer.phar" || return 1
if [ "$php_executable" = "$ZM_TEMP_DIR/php" ]; then
# shellcheck disable=SC2016
txt='#!/usr/bin/env sh
if [ -f "$(dirname $0)/php" ]; then
"$(dirname $0)/php" "$(dirname $0)/composer.phar" $*
else
php "$(dirname $0)/composer.phar" $*
fi'
echo "$txt" >"$ZM_TEMP_DIR/composer"
chmod +x "$ZM_TEMP_DIR/composer"
else
mv "$ZM_TEMP_DIR/composer.phar" "$ZM_TEMP_DIR/composer" && chmod +x "$ZM_TEMP_DIR/composer"
fi
fi
echo "$(nhead) 安装内建 Composer 完成!"
composer_executable="$ZM_TEMP_DIR/composer"
return 0
}
# 检查Composer可用性
function composer_check() {
# 顺带检查一下
echo "$(nhead) 正在检查 Git、unzip、7z 能否正常使用 ... "
type git >/dev/null 2>&1 || {
echo "$(nhead red) 检测到系统不存在 git 命令,可能无法正常使用 Composer 下载 GitHub 等仓库项目!"
}
zip_check_symbol=0
if type unzip >/dev/null 2>&1; then
zip_check_symbol=1
fi
if type 7z >/dev/null 2>&1; then
zip_check_symbol=1
fi
if [ $zip_check_symbol -eq 0 ]; then
if [ "$($php_executable -m | grep zip)" = "" ]; then
echo "$(nhead red) 检测到系统不存在 unzip 或 7z 命令PHP 不存在 zip 扩展,可能无法正常使用 Composer 下载压缩包项目!"
fi
fi
# 测试 Composer 和 PHP 是否能正常使用
if [ "$("$composer_executable" -n about | grep Manager)" = "" ]; then
echo "$(nhead red) Download PHP binary and composer failed!"
return 1
fi
echo "$(nhead) 环境检查完成!"
return 0
}
# 环境检查
function darwin_env_check() {
echo -ne "$(nhead) 检查是否存在 PHP ... "
if type php >/dev/null 2>&1; then
php_executable=$(which php)
echo "位置:$php_executable"
if [ "$($php_executable -m | grep swoole)" = "" ]; then
echo "$(nhead red) PHP 不存在 swoole 扩展,可能无法正常使用 Swoole 框架!" && return 1
fi
else
echo "不存在"
if type brew >/dev/null 2>&1; then
echo -n "$(nhead yellow) 是否使用 Homebrew 安装 PHP[y/N] "
read -r y
if [ "$y" = "" ]; then y="N"; fi
if [ "$y" = "y" ]; then
brew install php || echo "$(nhead red) 安装 PHP 失败!" && return 1
else
echo "$(nhead red) 跳过安装 PHP" && return 1
fi
fi
fi
echo -ne "$(nhead) 检查是否存在 Composer ... "
if type composer >/dev/null 2>&1; then
composer_executable=$(which composer)
echo "位置:$composer_executable"
else
echo "不存在,正在下载 Composer ..."
install_native_composer || return 1
fi
composer_check || return 1
}
# 询问是否安装 native php
function prompt_install_native_php() {
echo -ne "$(nhead yellow) 检测到系统的 PHP 不存在 swoole 扩展,是否下载安装独立的内建 PHP 和 Composer[Y/n] "
read -r y
case $y in
Y|y|"") return 0 ;;
*) echo "$(nhead red) 跳过安装内建 PHP" && return 1 ;;
esac
}
# 环境检查
function linux_env_check() {
if [ "$ZM_NO_LOCAL_PHP" != "" ]; then # 如果指定了不使用本地 php则不检查直接下载
install_native_php && install_native_composer && composer_check && return 0 || return 1
else
echo -ne "$(nhead) 检查是否存在 PHP ... "
if type php >/dev/null 2>&1; then
php_executable=$(which php)
echo "位置:$php_executable"
if [ "$($php_executable -m | grep swoole)" = "" ]; then
echo "$(nhead red) PHP 不存在 swoole 扩展,可能无法正常使用 Swoole 框架!" && \
prompt_install_native_php && \
install_native_php && \
install_native_composer && composer_check && return 0 || return 1
fi
else
echo "不存在,将下载内建 PHP"
install_native_php || return 1
fi
fi
echo -ne "$(nhead) 检查是否存在 Composer ... "
if type composer >/dev/null 2>&1; then
composer_executable=$(which composer)
echo "位置:$composer_executable"
else
echo "不存在,将下载内建 Composer"
install_native_composer || return 1
fi
composer_check || return 1
}
function if_use_aliyun() {
if [ "$ZM_COMPOSER_PACKAGIST" = "" ]; then
$composer_executable -n config repos.packagist composer https://mirrors.aliyun.com/composer
fi
}
function if_restore_native_runtime() {
ZM_RUNTIME_DIR="$ZM_PWD/$ZM_CUSTOM_DIR/runtime/"
if [ "$php_executable" = "$ZM_TEMP_DIR/php" ]; then
echo "$(nhead) 移动内建 PHP 到框架目录 $ZM_RUNTIME_DIR ..." && \
mkdir -p "$ZM_RUNTIME_DIR" && \
mv "$ZM_TEMP_DIR/php" "$ZM_RUNTIME_DIR" || {
echo "$(nhead red) 移动内建 PHP 到框架目录失败!" && return 1
}
php_executable="$ZM_RUNTIME_DIR/php"
fi
if [ "$composer_executable" = "$ZM_TEMP_DIR/composer" ]; then
echo "$(nhead) 移动内建 Composer 到框架目录 $ZM_RUNTIME_DIR ..." && \
mkdir -p "$ZM_CUSTOM_DIR/runtime" && \
mv "$ZM_TEMP_DIR/composer" "$ZM_RUNTIME_DIR" && \
mv "$ZM_TEMP_DIR/composer.phar" "$ZM_RUNTIME_DIR" || {
echo "$(nhead red) 移动内建 Composer 到框架目录失败!" && return 1
}
composer_executable="$ZM_RUNTIME_DIR/composer"
fi
return 0
}
function install_framework() {
echo "$(nhead) 开始安装框架到目录 $ZM_CUSTOM_DIR ..."
mkdir -p "$ZM_PWD/$ZM_CUSTOM_DIR" && \
cd "$ZM_PWD/$ZM_CUSTOM_DIR" && \
$composer_executable init --name="zhamao/framework-starter" -n -q && \
if_use_aliyun && \
echo "$(nhead) 从 Composer 拉取框架 ..." && \
$composer_executable require -n -q zhamao/framework:^2.7 && \
$composer_executable require -n -q --dev swoole/ide-helper:^4.5 && \
if_restore_native_runtime && \
echo "$(nhead) 初始化框架脚手架文件 ..." && \
vendor/bin/start init >/dev/null 2>&1 && \
$composer_executable dump-autoload -n -q && \
echo "$(nhead) 安装框架完成,已安装到目录 $ZM_CUSTOM_DIR" && \
echo -e "$(nhead) 启动框架命令:""$_cyan""cd $ZM_CUSTOM_DIR && ./zhamao server""$_reset" || {
echo "$(nhead red) 安装框架失败!" && return 1
}
}
# 环境变量设置
test "$ZM_TEMP_DIR" = "" && ZM_TEMP_DIR="/tmp/.zm-runtime"
test "$ZM_CUSTOM_DIR" = "" && ZM_CUSTOM_DIR="zhamao-app"
if [ -d "$ZM_PWD/$ZM_CUSTOM_DIR" ]; then
echo "$(nhead red) 检测到目录 $ZM_CUSTOM_DIR/ 已安装过框架,请更换文件夹名称或删除旧文件夹再试!"
exit 1
fi
# 检查系统环境,目前只支持 Linux
case $(uname -s) in
Linux) linux_env_check || exit 1 ;;
Darwin) darwin_env_check || exit 1 ;;
*) echo "$(nhead red) Only support Linux and macOS!" && exit 1 ;;
esac
# 安装框架
install_framework