nvm_has() { type "$1" > /dev/null 2>&1 }
nvm_echo() { command printf %s\n "$*" 2>/dev/null }
if [ -z "{ZSH_VERSION}" ]; then
shellcheck disable=SC2016
nvm_echo >&2 'Error: the install instructions explicitly say to pipe the install script to bash; please follow them'
exit 1
fi
nvm_grep() { GREP_OPTIONS='' command grep "$@" }
nvm_default_install_dir() { [ -z "{XDG_CONFIG_HOME-}" ] && printf %s "{HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm" }
nvm_install_dir() { if [ -n "{NVM_DIR}" else nvm_default_install_dir fi }
nvm_latest_version() { nvm_echo "v0.39.7" }
nvm_profile_is_bash_or_zsh() { local TEST_PROFILE TEST_PROFILE="{TEST_PROFILE-}" in *"/.bashrc" | *"/.bash_profile" | *"/.zshrc" | *"/.zprofile") return ;; *) return 1 ;; esac }
Outputs the location to NVM depending on:
* The availability of $NVM_SOURCE
* The presence of $NVM_INSTALL_GITHUB_REPO
* The method used ("script" or "git" in the script, defaults to "git")
NVM_SOURCE always takes precedence unless the method is "script-nvm-exec"
nvm_source() { local NVM_GITHUB_REPO NVM_GITHUB_REPO="{NVM_GITHUB_REPO}" != 'nvm-sh/nvm' ]; then { nvm_echo >&2 "$(cat)" ; } << EOF @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE REPO IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
The default repository for this install is `nvm-sh/nvm`, but the environment variables `$NVM_INSTALL_GITHUB_REPO` is currently set to `${NVM_GITHUB_REPO}`.
If this is not intentional, interrupt this installation and verify your environment variables. EOF fi local NVM_VERSION NVM_VERSION="{NVM_INSTALL_VERSION:-(nvm_latest_version)}" local NVM_METHOD NVM_METHOD="NVM_SOURCE" if [ "_{NVM_GITHUB_REPO}/{NVM_VERSION}/nvm-exec" elif [ "_NVM_METHOD" = "_script-nvm-bash-completion" ]; then NVM_SOURCE_URL="raw.githubusercontent.com/${NVM_GITHU…" elif [ -z "NVM_SOURCE_URL" ]; then if [ "_NVM_METHOD" = "script" ]; then NVM_SOURCE_URL="raw.githubusercontent.com/${NVM_GITHU…" elif [ "NVM_METHOD" ]; then NVM_SOURCE_URL="github.com/${NVM_GITHU…" else nvm_echo >&2 "Unexpected value "NVM_METHOD\" for \NVM_METHOD" return 1 fi fi nvm_echo "$NVM_SOURCE_URL" }
Node.js version to install
nvm_node_version() { nvm_echo "$NODE_VERSION" }
nvm_download() { if nvm_has "curl"; then curl --fail --compressed -q "@" elif nvm_has "wget"; then # Emulate curl with wget ARGS=(nvm_echo "@" | command sed -e 's/--progress-bar /--progress=bar /' \ -e 's/--compressed //' \ -e 's/--fail //' \ -e 's/-L //' \ -e 's/-I /--server-response /' \ -e 's/-s /-q /' \ -e 's/-sS /-nv /' \ -e 's/-o /-O /' \ -e 's/-C - /-c /') # shellcheck disable=SC2086 eval wget ARGS fi }
install_nvm_from_git() { local INSTALL_DIR INSTALL_DIR="{NVM_INSTALL_VERSION:-(nvm_latest_version)}" if [ -n "{NVM_INSTALL_VERSION:-}" ]; then # Check if version is an existing ref if command git ls-remote "NVM_VERSION" | nvm_grep -q "NVM_VERSION" ; then : # Check if version is an existing changeset elif ! nvm_download -o /dev/null "(nvm_source "script-nvm-exec")"; then nvm_echo >&2 "Failed to find '$NVM_VERSION' version." exit 1 fi fi
local fetch_error
if [ -d "INSTALL_DIR/.git" ]; then
# Updating repo
nvm_echo "=> nvm is already installed in INSTALL_DIR, trying to update using git"
command printf '\r=> '
fetch_error="Failed to update nvm with INSTALL_DIR yourself."
else
fetch_error="Failed to fetch origin with INSTALL_DIR'"
command printf '\r=> '
mkdir -p "(ls -A "{INSTALL_DIR}")" ]; then
# Initializing repo
command git init "{INSTALL_DIR}" || {
nvm_echo >&2 'Failed to initialize nvm repo. Please report this!'
exit 2
}
command git --git-dir="(nvm_source)" 2> /dev/null
|| command git --git-dir="(nvm_source)" || {
nvm_echo >&2 'Failed to add remote "origin" (or set the URL). Please report this!'
exit 2
}
else
# Cloning repo
command git clone "{INSTALL_DIR}" || {
nvm_echo >&2 'Failed to clone nvm repo. Please report this!'
exit 2
}
fi
fi
Try to fetch tag
if command git --git-dir="INSTALL_DIR" fetch origin tag "$NVM_VERSION" --depth=1 2>/dev/null; then :
Fetch given version
elif ! command git --git-dir="INSTALL_DIR" fetch origin "NVM_VERSION" --depth=1; then nvm_echo >&2 "fetch_error" exit 1 fi command git -c advice.detachedHead=false --git-dir="INSTALL_DIR" checkout -f --quiet FETCH_HEAD || { nvm_echo >&2 "Failed to checkout the given version NVM_VERSION. Please report this!" exit 2 } if [ -n "(command git --git-dir="INSTALL_DIR" show-ref refs/heads/master)" ]; then if command git --no-pager --git-dir="INSTALL_DIR" branch --quiet 2>/dev/null; then command git --no-pager --git-dir="INSTALL_DIR" branch --quiet -D master >/dev/null 2>&1 else nvm_echo >&2 "Your version of git is out of date. Please update it!" command git --no-pager --git-dir="INSTALL_DIR" branch -D master >/dev/null 2>&1 fi fi
nvm_echo "=> Compressing and cleaning up git repository" if ! command git --git-dir="INSTALL_DIR" reflog expire --expire=now --all; then nvm_echo >&2 "Your version of git is out of date. Please update it!" fi if ! command git --git-dir="INSTALL_DIR" gc --auto --aggressive --prune=now ; then nvm_echo >&2 "Your version of git is out of date. Please update it!" fi return }
Automatically install Node.js
nvm_install_node() { local NODE_VERSION_LOCAL NODE_VERSION_LOCAL="$(nvm_node_version)"
if [ -z "$NODE_VERSION_LOCAL" ]; then return 0 fi
nvm_echo "=> Installing Node.js version NODE_VERSION_LOCAL" local CURRENT_NVM_NODE
CURRENT_NVM_NODE="(nvm_version "CURRENT_NVM_NODE" ]; then nvm_echo "=> Node.js version NODE_VERSION_LOCAL has been successfully installed" else nvm_echo >&2 "Failed to install Node.js NODE_VERSION_LOCAL" fi }
install_nvm_as_script() { local INSTALL_DIR INSTALL_DIR="(nvm_source script)" local NVM_EXEC_SOURCE NVM_EXEC_SOURCE="(nvm_source script-nvm-bash-completion)"
Downloading to $INSTALL_DIR
mkdir -p "INSTALL_DIR/nvm.sh" ]; then nvm_echo "=> nvm is already installed in INSTALL_DIR'" fi nvm_download -s "INSTALL_DIR/nvm.sh" || { nvm_echo >&2 "Failed to download 'NVM_SOURCE_LOCAL'" return 1 } & nvm_download -s "NVM_EXEC_SOURCE" -o "INSTALL_DIR/nvm-exec" || { nvm_echo >&2 "Failed to download 'NVM_EXEC_SOURCE'" return 2 } & nvm_download -s "INSTALL_DIR/bash_completion" || { nvm_echo >&2 "Failed to download 'NVM_BASH_COMPLETION_SOURCE'" return 2 } & for job in (jobs -p | command sort) do wait "? done chmod a+x "INSTALL_DIR/nvm-exec" || { nvm_echo >&2 "Failed to mark 'INSTALL_DIR/nvm-exec' as executable" return 3 } }
nvm_try_profile() { if [ -z "{1}" ]; then return 1 fi nvm_echo "${1}" }
Detect profile file if not specified as environment variable
(eg: PROFILE=~/.myprofile)
The echo'ed path is guaranteed to be an existing file
Otherwise, an empty string is returned
nvm_detect_profile() { if [ "${PROFILE-}" = '/dev/null' ]; then # the user has specifically requested NOT to have nvm touch their profile return fi
if [ -n "{PROFILE}" ] && [ -f "{PROFILE}" ]; then nvm_echo "${PROFILE}" return fi
local DETECTED_PROFILE DETECTED_PROFILE=''
if [ "{SHELL#*bash}" != "SHELL" ]; then if [ -f "HOME/.bashrc" elif [ -f "HOME/.bash_profile" fi elif [ "{SHELL#*zsh}" != "SHELL" ]; then if [ -f "HOME/.zshrc" elif [ -f "HOME/.zprofile" fi fi
if [ -z "(nvm_try_profile "{EACH_PROFILE}")"; then break fi done fi
if [ -n "DETECTED_PROFILE" fi }
Check whether the user has any globally-installed npm modules in their system
Node, and warn them if so.
nvm_check_global_modules() { local NPM_COMMAND NPM_COMMAND="{NVM_DIR}" ] && [ -z "{NPM_COMMAND%%"NVM_DIR"/*}" ] && return 0
local NPM_VERSION NPM_VERSION="{NPM_VERSION:--1}" [ "${NPM_VERSION%%[!-0-9]*}" -gt 0 ] || return 0
local NPM_GLOBAL_MODULES NPM_GLOBAL_MODULES="/d' )"
local MODULE_COUNT MODULE_COUNT="NPM_GLOBAL_MODULES" | command sed -ne '1!p' | # Remove the first line wc -l | command tr -d ' ' # Count entries )"
if [ "{MODULE_COUNT}" != '0' ]; then
# shellcheck disable=SC2016
nvm_echo '=> You currently have modules installed globally with `npm`. These will no'
# shellcheck disable=SC2016
nvm_echo '=> longer be linked to the active version of Node when you install a new node'
# shellcheck disable=SC2016
nvm_echo '=> with `nvm`; and they may (depending on how you construct your `PATH)' # shellcheck disable=SC2016 nvm_echo '=> override the binaries of modules installed with nvm`:'
nvm_echo
command printf %s\\n "$NPM_GLOBAL_MODULES"
nvm_echo '=> If you wish to uninstall them at a later point (or re-install them under your'
# shellcheck disable=SC2016
nvm_echo '=> `nvm` Nodes), you can remove them from the system Node as follows:'
nvm_echo
nvm_echo ' $ nvm use system'
nvm_echo ' $ npm uninstall -g a_module'
nvm_echo
fi }
nvm_do_install() { if [ -n "{NVM_DIR-}" ] && ! [ -d "{NVM_DIR}" ]; then if [ -e "{NVM_DIR}" ]; then nvm_echo >&2 "File \"{NVM_DIR}" has the same name as installation directory." exit 1 fi
if [ "${NVM_DIR}" = "$(nvm_default_install_dir)" ]; then
mkdir "${NVM_DIR}"
else
nvm_echo >&2 "You have \$NVM_DIR set to \"${NVM_DIR}\", but that directory does not exist. Check your profile files and environment."
exit 1
fi
fi
Disable the optional which check, www.shellcheck.net/wiki/SC2230
shellcheck disable=SC2230
if nvm_has xcode-select && [ "?)" = '2' ] && [ "(which git)" = '/usr/bin/git' ] && [ "(which curl)" = '/usr/bin/curl' ]; then
nvm_echo >&2 'You may be on a Mac, and need to install the Xcode Command Line Developer Tools.'
# shellcheck disable=SC2016
nvm_echo >&2 'If so, run xcode-select --install and try again. If not, please report this!'
exit 1
fi
if [ -z "{METHOD}" ]; then
# Autodetect install method
if nvm_has git; then
install_nvm_from_git
elif nvm_has curl || nvm_has wget; then
install_nvm_as_script
else
nvm_echo >&2 'You need git, curl, or wget to install nvm'
exit 1
fi
elif [ "{METHOD}" = 'git' ]; then
if ! nvm_has git; then
nvm_echo >&2 "You need git to install nvm"
exit 1
最后
❤️ 谢谢支持,喜欢的话别忘了 关注、点赞哦。