自動(dòng)部署模塊所需環(huán)境依賴--bat批處理

首發(fā):https://juejin.im/post/5c999c07e51d456d246deebf

nvm

什么是nvm-windows

nvm就是Node Version Manager(Node版本管理器)的簡(jiǎn)稱,很方便的在一臺(tái)機(jī)器上安裝多個(gè)版本的node并在多個(gè)node版本間自由切換。nvm-windows就是安裝在windows平臺(tái)上的nvm。

下載nvm-windows

安裝nvm-windows

  • 解壓nvm-noinstall.zip-->nvm-noinstall,并改名為nvm
  • 在D盤創(chuàng)建文件夾dev,把整個(gè)nvm文件夾拷貝到dev中
  • 在nvm文件夾下創(chuàng)建settings.txt(如果settings.txt不存在),打開settings.txt并輸入以下內(nèi)容
root: D:\dev\nvm       # nvm.exe所在位置的父路徑,也是環(huán)境變量NVM_HOME的值
path: D:\dev\nodejs    # nodejs快捷方式的存放位置,也是環(huán)境變量NVM_SYMLINK的值
arch: 64               # 如果是32位系統(tǒng),則這里的64改為32
proxy:                 # 沒有使用代理,可以不寫

配置環(huán)境變量

  • NVM_HOME:D:\dev\nvm
  • NVM_SYMLINK:D:\dev\nodejs
  • PATH:%NVM_HOME%;%NVM_SYMLINK%;
環(huán)境變量.png

驗(yàn)證nvm windows安裝是否成功

win+R,打開cmd,輸入 nvm -v,若出現(xiàn)下圖則表示成功。

nvm版本.png

node.js

下載node.js

安裝node.js

  • 如我下載的是node-v10.15.0-win-x64.zip,將其解壓,并改名為v8.11.1
  • 拷貝到nvm的根目錄下。注意,node的文件名必須是以v開頭的,nvm才能正常的加載它。如果要添加其它node版本,也是一樣操作。
  • 使用nvm use 10.15.0 指定版本之后,會(huì)在nvm同級(jí)生成一個(gè)v10.15.0版本node的快捷鍵
node版本.png

使用nvm加載指定版本的node

win+R,打開cmd

  • 查看可用的node版本:nvm list,
  • 切換指定node版本:nvm use 10.15.0
  • 檢查是否切換成功:node -v
nvm使用.png

npm

在之前安裝node的時(shí)候,自帶下載了npm。

查看npm版本號(hào)

查看npm版本號(hào):npm -v,安裝正確的話,會(huì)出現(xiàn)版本號(hào)。

改變npm原有的環(huán)境變量

首先我們要先配置npm全局模塊的存放路徑以及cache的路徑:

  • 在D盤下新建nodejs文件夾
  • 在nodejs下新建node_global以及node_cache兩個(gè)文件夾
  • 輸入以下命令,改變npm配置
npm config set prefix "D:\nodejs\node_global"
npm config set cache "D:\nodejs\node_cache"
  • 新建環(huán)境變量NODE_MODULES_PATH,輸入路徑D:\nodejs\node_global\node_modules,然后將NODE_MODULES_PATH變量添加進(jìn)path中,此后所安裝的模塊都會(huì)安裝到改路徑下
node_modules環(huán)境變量.png
  • 在命令行輸入以下命令試著安裝express(注:“-g”這個(gè)參數(shù)意思是裝到global目錄下,也就是上面說設(shè)置的“D:\nodejs\node_global”里面。)
npm install express -g
  • 安裝完畢后可以看到D:\nodejs\node_global\node_modules\express 已經(jīng)有內(nèi)容
  • 在命令行輸入node進(jìn)入編輯模式,輸入以下代碼測(cè)試是否能正常加載模塊
require('express')
nodea全局安裝.png

安裝cnpm(淘寶cnpm)

  • 輸入以下命令
npm install -g cnpm --registry=https://registry.npm.taobao.org
  • 添加系統(tǒng)變量path的內(nèi)容,新建CNPM_HOME,輸入 D:\nodejs\node_global
  • 注意cnpm的環(huán)境變量一定要設(shè)置,否則cnpm -v 時(shí)會(huì)包報(bào)錯(cuò)
cnpm_path.png
  • 輸入cnpm -v輸入是否正常
cnpm -v

bat批處理自動(dòng)部署

批處理基礎(chǔ)

  • %cd%表示執(zhí)行命令時(shí)所在的目錄,%~dp0表示批處理文件所在的目錄。
  • %cd%是可以改變的,因?yàn)樗硎镜氖钱?dāng)前目錄,如果在批處理中使用了cd命令就會(huì)改變他的值。
  • %~dp0是在執(zhí)行某個(gè)批處理結(jié)束之前是不會(huì)改變的,因?yàn)榇淼氖悄_本文件在磁盤的位置。
  • %computername%:計(jì)算機(jī)名
  • %username%:當(dāng)前用戶名

所需資源

  • 1.在任意位置新建文件夾axTool
  • 2.將node-v10.15.0-win-x86解壓,并改名為node,子目錄中包含node.exe
  • 3.將拉完node_modules所有依賴的AX放入其中
  • 4.新建scripts文件夾,放入ax、ax.cmd兩個(gè)文件,可將下文代碼分別復(fù)制保存
  • 5.新建ax.bat文件,可將下文代碼復(fù)制保存

其中ax為shell腳本

#!/bin/sh
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")

case `uname` in
    *CYGWIN*) basedir=`cygpath -w "$basedir"`;;
esac

if [ -x "$basedir/node" ]; then
  "$basedir/node"  "$basedir/node_modules/ax/bin.js" "$@"
  ret=$?
else 
  node  "$basedir/node_modules/ax/bin.js" "$@"
  ret=$?
fi
exit $ret

ax.cmd

@IF EXIST "%~dp0\node.exe" (
  "%~dp0\node.exe"  "%~dp0\node_modules\ax\bin.js" %*
) ELSE (
  @SETLOCAL
  @SET PATHEXT=%PATHEXT:;.JS;=;%
  node  "%~dp0\node_modules\ax\bin.js" %*
)

ax.bat

@ECHO OFF

:: 一、設(shè)置變量
set axDir=%~dp0
set ax_home=%axDir%ax
set nodeHome=%axDir%node
set node_modules=%nodeHome%\node_modules

set src_ax_sh=%axDir%script\ax
set src_ax_cmd=%axDir%script\ax.cmd

set dest_ax_sh=%axDir%node\ax
set dest_ax_cmd=%axDir%node\ax.cmd

:: 二、把path環(huán)境變量寫入臨時(shí)文件中,以備后續(xù)使用findstr命令進(jìn)行查找
echo %path% > temp.txt

:: 在臨時(shí)文件中查找有沒有可執(zhí)行node路徑
find "%nodeHome%" temp.txt

:: 若沒有添加指定目錄則不添加,否則添加
if %errorlevel% == 0 (
    echo path環(huán)境變量中 已經(jīng)包含了 當(dāng)前路徑%nodeHome%
    echo 程序返回碼:%errorlevel%
) else (
    echo path環(huán)境變量中 沒有包含   當(dāng)前路徑%nodeHome%
    echo 程序返回碼:%errorlevel%
    setx /m "path" "%nodeHome%;%path%"
)

:: 三、刪除臨時(shí)文件
del temp.txt

:: 四、將AX項(xiàng)目軟連接進(jìn)node_modules中
cd /d %node_modules%
mklink /D ax %ax_home%

:: 五、將ax.sh、ax.cmd拷貝進(jìn)node全局環(huán)境
copy %src_ax_sh% %dest_ax_sh%
copy %src_ax_cmd% %dest_ax_cmd%

pause

目錄結(jié)構(gòu)

目錄.png

具體步驟

  • 設(shè)置node環(huán)境變量
D:\axTool\node;
  • 設(shè)置cnpm環(huán)境變量
D:\axTool\node\nodejs\node_global;
  • 進(jìn)入到node全局模塊下
cd /d D:\axTool\node\nodejs\node_global\node_modules
  • 將ax 項(xiàng)目軟連接進(jìn)node全局模塊
mklink /D ax D:\axTool\ax
  • 將ax.sh、ax.cmd兩個(gè)文件復(fù)制到node全局模塊下
del D:\axTool\node\nodejs\node_global\ax
del D:\axTool\node\nodejs\node_global\ax.cmd

copy D:\axTool\script\ax D:\axTool\node\nodejs\node_global\ax
copy D:\axTool\script\ax.cmd D:\axTool\node\nodejs\node_global\ax.cmd

所遇問題

  • 修改系統(tǒng)環(huán)境變量易誤刪,修改用戶環(huán)境變量較安全
wmic ENVIRONMENT create name='node_home',username='%computername%\\%username%',VariableValue="%node_home%"
  • 使用set設(shè)置系統(tǒng)環(huán)境變量無效
    使用 set 命令修改環(huán)境變量是只針對(duì)當(dāng)前命令行環(huán)境的臨時(shí)修改,改用setx。
setx /m "path" "%nodeHome%;%path%"
  • 遇到的問題
    追加一個(gè)路徑到永久的path環(huán)境變量中,但是可能運(yùn)行多次ax.bat,這樣就會(huì)造成ax.bat會(huì)寫入多個(gè)相同的路徑到path環(huán)境變量中。要解決這個(gè)問題,就需要在追加新路徑到path環(huán)境變量之前,先檢查path環(huán)境變量中是否已經(jīng)存在了該路徑,如果有了該路徑,那我就不需要再添加。如果沒有我再添加。不能一直無腦的添加。
echo %path% > temp.txt

:: 在臨時(shí)文件中查找有沒有可執(zhí)行node路徑
find "%nodeHome%" temp.txt

:: 若沒有添加指定目錄則不添加,否則添加
if %errorlevel% == 0 (
    echo path環(huán)境變量中 已經(jīng)包含了 當(dāng)前路徑%nodeHome%
    echo 程序返回碼:%errorlevel%
) else (
    echo path環(huán)境變量中 沒有包含   當(dāng)前路徑%nodeHome%
    echo 程序返回碼:%errorlevel%
    setx /m "path" "%nodeHome%;%path%"
)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容