$PATH, nvm, npm, lerna

mac 环境变量

命令一旦添加到环境变量中,系统就知道从哪个路径中取出文件并执行。mac 有多个环境变量文件,不同的环境变量文件的作用域和加载时间也不同。在 mac 中,不同的 shell 所对应的配置文件也不同:bash 命令对应的配置文件是 .bash_profile;zsh 命令对应的配置文件是 .zshrc。

rc 即为 run command,一般为脚本类文件的后缀,这些脚本通常在程序启动的时候被调用,比如 .bashrc 就会在 bash shell 启动时调用。

mac 中环境变量配置文件的默认加载顺序如下:

1
2
3
4
5
6
7
/etc/profile # 系统级环境变量,任何用户登陆时都会读取该文件
/etc/bashrc # 系统级环境变量,bash shell执行时,不管是何种方式,读取该文件
/etc/paths # 系统级环境变量,任何用户登陆时都会读取该文件
~/.bash_profile # 包含用户专有的 bash 信息,当登录时以及每次打开新的 shell 时,该文件被读取;文件存在时,后面的几个文件都会被忽略
~/.bash_login # 系统级环境变量,任何用户登陆时都会读取该文件
~/.profile # 为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行;重启后生效
~/.bashrc # 每一个运行 bash shell 的用户执行该文件

添加或修改环境变量可使用如下语法($PATH 即原始的环境变量):

1
2
3
export PATH="$PATH:<PATH 1>:<PATH 2>:<PATH 3>:...:<PATH N>" # 修改环境变量的一般语法
export PATH='/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/alfred/apache-maven-3.5.0/bin'
echo $PATH # 查看环境变量

QA

Q: spawnSync npm ENOENT 报错问题?
A: 导致该问题有两个原因:其一是在 windows 环境下,实际制定的命令为 ‘npm.cmd’,当遇到这种情况时,可借助于 cross-spawn 库加以解决;其二是深度嵌套的子进程在执行 require(‘child_process’).spawn 脚本时,如果父进程重写了 process.env,那么该子进程就会丢失 process.env.path 配置,导致 npm 命令无法找到,这时可以拷贝根进程下的 process.env 配置。

brew

homebrew 是 linux 环境下的包管理工具。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 安装 brew
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

# 更新 brew,先卸载,再安装
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

# 更新
sudo brew update

brew install nodejs
brew uninstall nodejs
brew upgrade nodejs
brew search nodejs
brew remove nodejs
brew list # 列出当前安装的软件
brew search nodejs # 查询与 nodejs 相关的可用软件
brew info nodejs # 查询 nodejs 的安装信息

nvm

nvm 是 Mac 环境下 node 版本管理工具。Windows 平台下推荐 nvmw 或 nvm-windows

安装

1
2
3
4
5
6
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash

# .bash_profile 添加以下代码,须重启终端
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm

更新

1
2
3
4
5
(
cd "$NVM_DIR"
git fetch --tags origin
git checkout `git describe --abbrev=0 --tags --match "v[0-9]*" $(git rev-list --tags --max-count=1)`
) && \. "$NVM_DIR/nvm.sh"

卸载

1
2
3
4
5
6
sudo rm -rf ~/.nvm

# 移除 .bash_profile 中以下代码,卸载后须重启电脑
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion

命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
nvm debug # 查看 nvm 及 node 信息

nvm ls # 展示本地安装的所有 node 版本
nvm ls-remote # 展示所有可用的 node 版本;windows 环境下使用 nvm ls available
nvm install node # 安装 node 最新版本;'node' 是最新版本的别名
nvm install 6.14.4 # 安装 node 指定版本
nvm uninstall 6.14.4 # 卸载 node 指定版本
nvm use node # node 命令使用指定版本
nvm current # 查看正在使用的 node 版本
nvm run node --version # 使用指定版本执行指定命令
nvm exec 4.2 node --version # 使用指定版本执行指定命令
nvm which 5.0 # 查看指定版本的安装位置
nvm install 6 --reinstall-packages-from=5 # 将 5 版本中安装的全局模块安装到 6 版本中

nvm alias awesome-version 4.2.2 # 为指定版本的 node 起别名
nvm unalias awesome-version # 移除别名

npm

命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
npm install -g npm@3 # npm 升级到 v3 版本
npm install -g cnpm --registry=https://registry.npm.taobao.org # 安装 cnpm

npm publish # 发布包;npm 发布内容优先级为 package.json 中 files 选项,.npmignore, .gitignore
npm unpublish # 撤销发布

npm home $package # npm home loadsh 访问 lodash 主页
npm repo $package # 访问 github 仓库

npm outdate # 检索过时的依赖
npm prune # 剔除未在 package.json 中注明的 node_modules 依赖
npm version <update_type> # npm version patch,minor,major 自动升级版本号;patch 小改动或bug修复,minor 添加新特性,major 大改动且无法向后兼容
npm shrinkwrap # 生成 npm-shrinkwrap.json 文件,锁定依赖版本号

npm config set prefix $dir # 变更安装目录为$dir;chown -R $USER $dir改变$dir目录的操作权限;再将$dir/bin加入环境变量,可以不用 sudo
npm config set save-prefix=“~” # 改变默认保存前缀;波浪号~,表示当信赖的副版本号有更新时,允许使用npm update进行安装;脱字符^,表示当依赖的主版本号有更新时,允许使用 npm update 进行安装
npm config set init.author.name $name,npm config set init.author.email $email # npm init初始化项目时启用特定值配置 package.json
npm config set init-module ~/.npm-init.js # 以特定脚本配置 package.json

备忘

  1. 安装依赖包时携带 –production 参数,将不予安装devDependencies依赖;若设置N ODE_ENV 环境变量为production,devDependencies 依赖也不会被安装。
  2. 项目中若不存在 .npmignore 文件,将取用 .gitignore 设定以及一些默认配置。

QA

Q: 在执行 npm link 命令时,遇到 Unhandled rejection RangeError: Maximum call stack size exceededill install loadIdealTree 报错,该如何处理?
A: 尝试清空工程目录中的 node_modules 依赖,再次执行 npm link,参考 Maximum call stack size exceeded on npm install

lerna

lerna 是面向 js 的多包管理器。

安装

1
cnpm install lerna -g

参考

Mac的环境变量和nvm的使用