自動部署模組所需環境依賴--bat批處理

RikaXia發表於2019-03-26

nvm

什麼是nvm-windows

nvm就是Node Version Manager(Node版本管理器)的簡稱,很方便的在一臺機器上安裝多個版本的node並在多個node版本間自由切換。nvm-windows就是安裝在windows平臺上的nvm。

下載nvm-windows

安裝nvm-windows

  • 解壓nvm-noinstall.zip-->nvm-noinstall,並改名為nvm
  • 在D盤建立資料夾dev,把整個nvm資料夾拷貝到dev中
  • 在nvm資料夾下建立settings.txt(如果settings.txt不存在),開啟settings.txt並輸入以下內容
root: D:\dev\nvm       # nvm.exe所在位置的父路徑,也是環境變數NVM_HOME的值
path: D:\dev\nodejs    # nodejs快捷方式的存放位置,也是環境變數NVM_SYMLINK的值
arch: 64               # 如果是32位系統,則這裡的64改為32
proxy:                 # 沒有使用代理,可以不寫
複製程式碼

配置環境變數

  • NVM_HOME:D:\dev\nvm
  • NVM_SYMLINK:D:\dev\nodejs
  • PATH:%NVM_HOME%;%NVM_SYMLINK%;

環境變數.png

驗證nvm windows安裝是否成功

win+R,開啟cmd,輸入 nvm -v,若出現下圖則表示成功。

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 指定版本之後,會在nvm同級生成一個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的時候,自帶下載了npm。

檢視npm版本號

檢視npm版本號:npm -v,安裝正確的話,會出現版本號。

改變npm原有的環境變數

首先我們要先配置npm全域性模組的存放路徑以及cache的路徑:

  • 在D盤下新建nodejs資料夾
  • 在nodejs下新建node_global以及node_cache兩個資料夾
  • 輸入以下命令,改變npm配置
npm config set prefix "D:\nodejs\node_global"
npm config set cache "D:\nodejs\node_cache"
複製程式碼
  • 新建環境變數NODE_MODULES_PATH,輸入路徑D:\nodejs\node_global\node_modules,然後將NODE_MODULES_PATH變數新增進path中,此後所安裝的模組都會安裝到改路徑下

node_modules環境變數.png

  • 在命令列輸入以下命令試著安裝express(注:“-g”這個引數意思是裝到global目錄下,也就是上面說設定的“D:\nodejs\node_global”裡面。)
npm install express -g
複製程式碼
  • 安裝完畢後可以看到D:\nodejs\node_global\node_modules\express 已經有內容
  • 在命令列輸入node進入編輯模式,輸入以下程式碼測試是否能正常載入模組
require('express')
複製程式碼

nodea全域性安裝.png

安裝cnpm(淘寶cnpm)

  • 輸入以下命令
npm install -g cnpm --registry=https://registry.npm.taobao.org
複製程式碼
  • 新增系統變數path的內容,新建CNPM_HOME,輸入 D:\nodejs\node_global
  • 注意cnpm的環境變數一定要設定,否則cnpm -v 時會包報錯

cnpm_path.png

  • 輸入cnpm -v輸入是否正常
cnpm -v
複製程式碼

bat批處理自動部署

批處理基礎

  • %cd%表示執行命令時所在的目錄,%~dp0表示批處理檔案所在的目錄。
  • %cd%是可以改變的,因為它表示的是當前目錄,如果在批處理中使用了cd命令就會改變他的值。
  • %~dp0是在執行某個批處理結束之前是不會改變的,因為代表的是指令碼檔案在磁碟的位置。
  • %computername%:計算機名
  • %username%:當前使用者名稱

所需資源

  • 1.在任意位置新建資料夾axTool
  • 2.將node-v10.15.0-win-x86解壓,並改名為node,子目錄中包含node.exe
  • 3.將拉完node_modules所有依賴的AX放入其中
  • 4.新建scripts資料夾,放入ax、ax.cmd兩個檔案,可將下文程式碼分別複製儲存
  • 5.新建ax.bat檔案,可將下文程式碼複製儲存

其中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

:: 一、設定變數
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環境變數寫入臨時檔案中,以備後續使用findstr命令進行查詢
echo %path% > temp.txt

:: 在臨時檔案中查詢有沒有可執行node路徑
find "%nodeHome%" temp.txt

:: 若沒有新增指定目錄則不新增,否則新增
if %errorlevel% == 0 (
	echo path環境變數中 已經包含了 當前路徑%nodeHome%
	echo 程式返回碼:%errorlevel%
) else (
	echo path環境變數中 沒有包含   當前路徑%nodeHome%
	echo 程式返回碼:%errorlevel%
	setx  path "%nodeHome%;%path%"
)

:: 三、刪除臨時檔案
del temp.txt

:: 四、將AX專案軟連線進node_modules中
cd /d %node_modules%
mklink /D ax %ax_home%

:: 五、將ax.sh、ax.cmd拷貝進node全域性環境
copy %src_ax_sh% %dest_ax_sh%
copy %src_ax_cmd% %dest_ax_cmd%

pause
複製程式碼

目錄結構

目錄.png

具體步驟

  • 設定node環境變數
D:\axTool\node;
複製程式碼
  • 設定cnpm環境變數
D:\axTool\node\nodejs\node_global;
複製程式碼
  • 進入到node全域性模組下
cd /d D:\axTool\node\nodejs\node_global\node_modules
複製程式碼
  • 將ax 專案軟連線進node全域性模組
mklink /D ax D:\axTool\ax
複製程式碼
  • 將ax.sh、ax.cmd兩個檔案複製到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
複製程式碼

所遇問題

  • 修改系統環境變數易誤刪,修改使用者環境變數較安全
wmic ENVIRONMENT create name='node_home',username='%computername%\\%username%',VariableValue="%node_home%"
複製程式碼
  • 使用set設定系統環境變數無效 使用 set 命令修改環境變數是隻針對當前命令列環境的臨時修改,改用setx。
setx path "%nodeHome%;%path%"
複製程式碼
  • 遇到的問題 追加一個路徑到永久的path環境變數中,但是可能執行多次ax.bat,這樣就會造成ax.bat會寫入多個相同的路徑到path環境變數中。要解決這個問題,就需要在追加新路徑到path環境變數之前,先檢查path環境變數中是否已經存在了該路徑,如果有了該路徑,那我就不需要再新增。如果沒有我再新增。不能一直無腦的新增。
echo %path% > temp.txt

:: 在臨時檔案中查詢有沒有可執行node路徑
find "%nodeHome%" temp.txt

:: 若沒有新增指定目錄則不新增,否則新增
if %errorlevel% == 0 (
	echo path環境變數中 已經包含了 當前路徑%nodeHome%
	echo 程式返回碼:%errorlevel%
) else (
	echo path環境變數中 沒有包含   當前路徑%nodeHome%
	echo 程式返回碼:%errorlevel%
	setx /m "path" "%nodeHome%;%path%"
)
複製程式碼

相關文章