在npm运行构建命令

时间:2019-12-09 08:34:45

标签: bash shell npm

我已经编写了一个Shell脚本deploy.sh,用于将VueJS应用程序部署到生产或开发(用于测试和QA)服务器。在部署应用程序之前,此脚本将首先通过dist生成一个npm run build文件夹,然后将dist文件夹复制到各自的生产或开发服务器。

此脚本有4个必需选项,每个选项都有一个必需参数。

4个必需选项是:

  • t-部署类型'prod'或'dev'
  • i-要将应用程序部署到的服务器的IP地址
  • f-要部署在/var/www/html服务器的nginx中的文件夹
  • p-.pem文件的路径,用于针对生产或开发服务器进行身份验证

这是我的脚本./deploy.sh -t dev -i 12.345.67.890 -f my-folder -p ~/.ssh/DevServerCredentials.pem的运行方式。

在此shell脚本的一部分中,我具有以下内容来生成dist文件夹:

#!/bin/bash

# Use this script to deploy app to production or development server

curdir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"

usage() {
    echo ""
    echo "Usage: ./deploy.sh -t [ prod | dev ] -i [ server-IP-to-deploy-to ] -f [ folder-in-server-to-deploy-to ] -p [ pem-file-location ]"
    echo ""
    echo "Example:"
    echo "  Development Server >> ./deploy.sh -t dev -i 12.345.67.890 -f my-dev-folder -p ~/.ssh/DevServerCredentials.pem"
    echo "  Production Server >> ./deploy.sh -t prod -i website.domain-name.com -f my-prod-folder -p ~/.ssh/ProdServerCredentials.pem"
    echo ""
    exit 2
}

set_variable() {
    local varname=$1
    shift
    if [ -z "${!varname}" ]; then
        eval "$varname=\"$@\""
    else
        echo "Error: $varname already set"
        usage
    fi
}

while getopts 't:i:f:p:?h' c; do
    case $c in
        t) set_variable type $OPTARG ;; 
        i) set_variable ip $OPTARG ;;
        f) set_variable folder $OPTARG ;;
        p) set_variable pem $OPTARG ;;
        h) usage ;;
    esac
done

# checks for wrong and missing arguments
if [ "$type" != 'prod' ] && [ "$type" != 'dev' ] ; then
    echo "Wrong argument given: -t accepts either 'prod' or 'dev'."
    usage
    exit 1
fi

if [ -z "$type" ]; then
    echo "Missing argument: -t argument is missing."
    usage
    exit 1
fi

if [ -z "$ip" ]; then
    echo "Missing argument: -i argument is missing."
    usage
    exit 1
fi

if [ -z "$folder" ]; then
    echo "Missing argument: -f argument is missing."
    usage
    exit 1
fi

if [ -z "$pem" ]; then
    echo "Missing argument: -p argument is missing."
    usage
    exit 1
fi

# set remote server home directory
if [ "$type" = "prod" ] ; then
    homedir=/home/ubuntu
    user=ubuntu
elif [ "$type" = "dev" ] ; then
    homedir=/home/ec2-user
    user=ec2-user
else
    echo "type is neither 'prod' nor 'dev'"
fi

# generate dist folder to be copied to server
if [ "$type" == 'prod' ]; then
    echo "execute npm run build using environment variables from .env.production.local"
    npm run build
fi

if [ "$type" == 'dev' ]; then
    echo "execute npm run build-test using environment variables from .env.test.local"
    npm run build-test
fi

scp -r -i $pem $curdir/../dist $user@$ip:/$homedir/temp

if [ "$folder" = "/" ] ; then
    ssh -t -i $pem $user@$ip "
        dir=\$PWD;
        mv \$dir/temp/index.html \$dir;
        mv \$dir/temp \$dir/dist;

        sudo cp -r \$dir/dist /var/www/html
        sudo cp -r \$dir/index.html /var/www/html
        rm -rf \$dir/*
    "
else
    ssh -t -i $pem $user@$ip "
        dir=\$PWD;
        mkdir \$dir/$folder;
        cd \$dir/$folder;
        mkdir dist

        mv \$dir/temp/index.html \$dir/$folder;
        mv \$dir/temp/* \$dir/$folder/dist;
        rm -rf \$dir/temp;

        sudo cp -r \$dir/$folder /var/www/html
        rm -rf \$dir/*
    "
fi

以下是package.json文件:

{
.
.
    "scripts": {
        "serve": "vue-cli-service serve",
        "build": "vue-cli-service build",
        "build-test": "vue-cli-service build --mode test",
        "lint": "vue-cli-service lint"
    },
.
.
}

根据传递给t选项的参数,它运行各自的npm命令来生成一个dist文件夹,该文件夹将相应地部署到生产或开发服务器。

我遇到的问题是,npm命令之后,shell脚本暂停,随后超时并退出,因此dist文件夹未复制到服务器。

shell脚本中将dist文件夹复制到服务器的部分发生在运行npm命令之后。

如何编辑我的shell脚本,使其在npm命令完成后继续执行?

根据我的了解和了解,可以使用sh脚本运行npm脚本,尽管npm本身并不支持此功能,但该脚本也可以接受带有变通方法的参数。同样通过npm,我将必须将参数值传递给npm,然后传递给sh脚本。这似乎是我在部署sh脚本中发现错误的地方。

我宁愿通过sh脚本而不是通过npm来实现预期的目标。

0 个答案:

没有答案