【问题标题】:Install NPM into home directory with distribution nodejs package (Ubuntu)使用分发 nodejs 包将 NPM 安装到主目录(Ubuntu)
【发布时间】:2012-04-22 07:16:42
【问题描述】:

我想使用分发的 Node.js 包(或 chris-lea ppa 以获得最新版本),但将 NPM 安装到我的主目录。

这可能看起来很挑剔,但对于使用 polyglot/github 的开发人员来说,这是一种非常惯用的方式来在 Linux 下设置语言运行时/库环境:运行时的发行包,每个用户环境中的第 3 方库(参见 virtualenv, RVM - 如果你愿意,RVM 也会为你构建 Ruby)。如有必要,我将在本地构建节点,但它是一个 PITA,因为 Node 正在成为许多项目的附带开发需求。

【问题讨论】:

标签: node.js npm


【解决方案1】:

您可以使用npm-user 自动设置npm 将软件包安装到您的用户目录而不是系统目录。不需要root 权限。

Here's a link to the script,有关如何使用它的说明以及有关其选项的信息。它适用于 macOS、Linux、*BSD 和 Windows。

你可以这样运行它:

$ curl -s "https://raw.githubusercontent.com/alexdelorenzo/npm-user/main/npm-user.sh" | bash

运行后,使用npm install -g <package> 会将软件包安装到您用户的目录中,而无需使用sudo

如果您想将代码复制并粘贴到控制台中,请查看以下代码:

#!/usr/bin/env bash
# Copyright 2022 Alex DeLorenzo <alexdelorenzo.dev>. Licensed under the GPLv3.
export ROOT="${1:-$HOME}"

export NPM_DIR=".npm-packages"
export NPM_ROOT="$ROOT/$NPM_DIR"
export NPM_BIN="$NPM_ROOT/bin"
export NPM_MAN="$NPM_ROOT/share/man"

export BASH_RC="$HOME/.bashrc"
export ZSH_RC="$HOME/.zshrc"
export DEFAULT_RC="$BASH_RC"

export NULL="/dev/null"
test $OSTYPE == win* &&
  export NULL="NUL"


quiet() {
  "$@" &> "$NULL"
}


create-paths() {
  local bin="${1:-$NPM_BIN}"
  local man="${2:-$NPM_MAN}"

  mkdir --parents --verbose "$bin"
  mkdir --parents --verbose "$man"
}


set-prefix() {
  npm config set prefix "$NPM_ROOT"
}


already-added() {
  local rc="${1:-$DEFAULT_RC}"
  local bin="${2:-$NPM_BIN}"
  local line="export PATH=\"\$PATH:$bin\""

  quiet grep "$line" "$rc"
}


add-to-path () {
  local rc="${1:-$DEFAULT_RC}"
  local bin="${2:-$NPM_BIN}"
  local man="${3:-$NPM_MAN}"

  cat <<EOF
export PATH="\$PATH:$bin"
export MANPATH="\${MANPATH:-\$(manpath)}:$man"
export NPM_PACKAGES="$NPM_ROOT"
EOF
}


main() {
  local rc="${1:-$DEFAULT_RC}"
  local bin="${2:-$NPM_BIN}"
  local man="${3:-$NPM_MAN}"

  printf "Creating $bin and $man\n"
  create-paths "$bin" "$man"

  printf "Setting npm prefix.\n"
  set-prefix

  if ! already-added "$rc" "$bin"; then
    printf "Writing to %s.\n" "$rc"
    add-to-path "$rc" "$bin" "$man" >> "$rc"
  fi

  printf "Done.\n\n"
  printf "To load the changes in this shell, run:\n"
  printf "\tsource $rc\n"
}


main "$2" "$3" "$4"

【讨论】:

    【解决方案2】:

    至少在 Ubuntu 上,系统范围 npm 的默认配置是 npm install --global 尝试将软件包安装到 /usr/lib/node_modules。要为您自己的用户帐户设置不同的默认值,请运行以下一次:

    mkdir -p ~/.npm/lib/bin
    npm config set prefix "~/.npm/lib"
    

    另外你想要.profile中的以下片段:

    # set PATH so it includes user's private .npm/lib/bin if it exists
    if [ -d "$HOME/.npm/lib/bin" ] ; then
        PATH="$HOME/.npm/lib/bin:$PATH"
    fi
    

    如果您现在使用 npm install --global packagename 安装某些东西,它将最终位于正确的位置,并且可以在您的 PATH 中找到(您可能需要注销并重新登录才能使 .profile 更改生效)。

    当然,您也可以选择其他目录。例如,~/.config/npm 可能适用于现代系统。

    【讨论】:

      【解决方案3】:

      对于类似问题,我有一个稍微不同的解决方案,这是由于我全局安装了npm,所以我可以在我的 macOS 系统的终端中使用它。我只是在我的存储库的根目录中使用以下命令在本地初始化它:

      npm init --yes
      

      这使我能够使用“package.json”和“package-lock.json”文件将节点包安装在 /node_modules 的本地根目录中,而不是在用户的主目录中。

      【讨论】:

        【解决方案4】:

        其他答案有过时的解决方案:2020 年的解决方案是使用NPM_CONFIG_PREFIX 环境变量。 (见details

        例如,

        $ NPM_CONFIG_PREFIX="$HOME/.npm-packages" npm install -g ios-sim
        /Users/<name>/.npm-packages/bin/ios-sim -> /Users/<name>/.npm-packages/lib/node_modules/ios-sim/bin/ios-sim
        + ios-sim@9.0.0
        added 108 packages from 68 contributors in 3.094s
        

        【讨论】:

          【解决方案5】:

          NPM 已经将本地包安装到您的项目中,但我仍然希望系统远离我的操作系统文件。以下是我建议划分 Nodejs 包的方法:

          通过 chris-lea PPA 安装 Nodejs 和 NPM。然后我在我的 homedir 中设置了一个包根来保存节点“全局”包:

           $ NPM_PACKAGES="$HOME/.npm-packages"
           $ mkdir -p "$NPM_PACKAGES"
          

          设置 NPM 使用这个目录来安装它的全局包:

           $ echo "prefix = $NPM_PACKAGES" >> ~/.npmrc
          

          通过将以下内容添加到您的 .zshrc/.bashrc 中,配置您的 PATH 和 MANPATH 以查看 $NPM_PACKAGES 前缀中的命令:

          # NPM packages in homedir
          NPM_PACKAGES="$HOME/.npm-packages"
          
          # Tell our environment about user-installed node tools
          PATH="$NPM_PACKAGES/bin:$PATH"
          # Unset manpath so we can inherit from /etc/manpath via the `manpath` command
          unset MANPATH  # delete if you already modified MANPATH elsewhere in your configuration
          MANPATH="$NPM_PACKAGES/share/man:$(manpath)"
          
          # Tell Node about these packages
          NODE_PATH="$NPM_PACKAGES/lib/node_modules:$NODE_PATH"
          

          现在当你执行npm install -g 时,NPM 会将库安装到~/.npm-packages/lib/node_modules,并将可执行工具链接到~/.npm-packages/bin,它在你的PATH 中。

          像往常一样使用npm install -g

          [justjake@marathon:~] $ npm install -g coffee-script
          ... (npm downloads stuff) ...
          /home/justjake/.npm-packages/bin/coffee -> /home/justjake/.npm-packages/lib/node_modules/coffee-script/bin/coffee
          /home/justjake/.npm-packages/bin/cake -> /home/justjake/.npm-packages/lib/node_modules/coffee-script/bin/cake
          coffee-script@1.3.3 /home/justjake/.npm-packages/lib/node_modules/coffee-script
          
          [justjake@marathon:~] $ which coffee
          /home/justjake/.npm-packages/bin/coffee
          

          【讨论】:

          • 如果您在共享系统上安装了node 但未安装npm,请按照上述答案中的设置,然后npm_config_prefix=$NPM_PACKAGES curl -L https://npmjs.org/install.sh | shnpm 本身安装在您的主目录。
          • 前缀集在 npm 2.10.1 上对我不起作用,所以我最终运行 npm config set prefix $NPM_PACKAGES
          • 以下脚本声称可以自动执行此操作:github.com/glenpike/npm-g_nosudo
          • 我使用$HOME/.local 代替前缀。这是现在其他软件常用的文件夹来存储本地文件。
          • 如果你使用:echo 'prefix = ${NPM_PACKAGES}' &gt;&gt; ~/.npmrc,路径不是硬编码在.npmrc中,但是每当npm运行时npm都会从环境变量中读取它(注意我在"更改为'为了防止执行回显的shell扩展变量,我在变量周围添加了{},因为这是.npmrc中使用的语法。为了使这项工作,我必须更改.bashrc以读取:export NPM_PACKAGES="$HOME/.npm-packages"。添加export 使其可用于npm。不相关,我认为您还需要将export 添加到其他变量中。
          【解决方案6】:

          Jake 的答案发布于 2012 年,虽然有用,但它引用了 Chris Lea 的 Node.js PPA,自 2015 年 3 月起不再更新。

          以下是我在主目录中安装 Node.js 和 npm 的步骤:

          使用nvm 安装Node.js(不需要sudo):

          curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bash
          source ~/.bashrc
          nvm install 7
          npm install -g npm  # update npm
          

          现在您可以在没有sudo 的情况下使用install -g,一切都进入~/.nvm/

          或者在没有 nvm 的情况下安装 Node.js (official instructions):

          安装 Node.js

          • Node.js v6(截至 2017 年 5 月的当前 LTS):

            curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash -
            sudo apt-get install -y nodejs
            
          • Node.js v7:

            curl -sL https://deb.nodesource.com/setup_7.x | sudo -E bash -
            sudo apt-get install -y nodejs
            

          将 npm 的默认目录更改为本地目录:

          mkdir ~/.npm-global
          npm config set prefix '~/.npm-global'
          export PATH="$HOME/.npm-global/bin:$PATH"  # ← put this line in .bashrc
          source ~/.bashrc  # if you only updated .bashrc
          

          或者将.npm-global 替换为您选择的目录。

          更新 npm 并检查它是否安装在您的 $HOME 目录中:

          $ npm install npm -g
          /home/<username>/.npm-global/bin/npm -> /home/<username>/.npm-global/lib/node_modules/npm/bin/npm-cli.js
          /home/<username>/.npm-global/lib
          └─┬ npm@3.10.6 
            ├─┬ glob@7.0.5 
            │ └── minimatch@3.0.2 
            ├── npm-user-validate@0.1.5 
            └── rimraf@2.5.3 
          

          现在您可以在没有sudo 的情况下使用install -g 并且不会弄乱您的系统文件。

          【讨论】:

          【解决方案7】:

          如前所述 herehere

          npm config set prefix ~
          echo export PATH=\$PATH:\~/bin >> ~/.bashrc
          . ~/.bashrc
          

          【讨论】:

            【解决方案8】:

            我使用@just-jake solution 一段时间,发现nvm 更容易设置。 它也是非常强大的解决方案,允许安装和使用不同版本的nodejs

            在 Ubuntu 14.04 或 16.04 上:

            1. 安装构建nodejs的必备包:

              sudo apt-get update
              sudo apt-get install build-essential libssl-dev
              
            2. 安装nvm:

              curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.1/install.sh | bash
              

              如果有更新版本的 nvm 可用,您可以在 nvm 站点上找到实际安装命令。

            3. nvm 安装程序会将引导脚本添加到~/.bashrc,因此您需要重新打开终端才能运行它,或者这样做:

              source ~/.bashrc
              
            4. 现在你可以安装任何你喜欢的nodejs 版本,在它们之间切换等等。

              使用nvm ls-remote 列出可用的nodejs 版本。

              要安装,例如,nodejs v4.2.4:

              # install v4.2.4
              nvm install v4.2.4 
              # use nodejs v4.2.4 in the current terminal session
              nvm use v4.2.4
              # use v4.2.4 by default in new terminal session
              nvm alias default v4.2.4
              

            【讨论】:

              【解决方案9】:

              因为 python 已经做得很好了virtualenv,所以我使用nodeenv。与nvm相比,您可以为同一节点版本创建多个环境(例如,节点0.10的两个环境但具有不同的包集)。

              ENVNAME=dev1
              
              #  create an environment
              python -m virtualenv ${ENVNAME}
              
              # switch to the newly created env
              source ${ENVNAME}/bin/activate
              
              # install nodeenv
              pip install nodeenv
              
              # install system's node into virtualenv
              nodeenv --node=system --python-virtualenv
              

              自述文件非常好: https://github.com/ekalinin/nodeenv

              【讨论】:

                【解决方案10】:

                扩展 Just Jake 和 user1533401 提供的答案:我无法降级,因为我使用共享主机并且节点安装在系统目录中。这也是为什么我要更改 npm 安装全局脚本的目录的原因。对于那些在同一条船上的人,这是我发现的另一个临时修复:

                npm install -g --prefix=$(npm config get prefix) &lt;package&gt;

                错误是 npm 不会读取您的每用户配置文件,但每次安装全局脚本时都指定它来修复该问题。找到here

                【讨论】:

                  【解决方案11】:

                  Just Jake 发布的解决方案很棒。但是,由于 npm > 1.4.10 的错误,它可能无法按预期工作。 (见thisthis

                  当错误解决后,您可以按照以下步骤降级到 npm 1.4.10:

                  1. 注释 $HOME/.npmrc 中的前缀行
                  2. 运行sudo npm install -g npm@1.4.10
                  3. 确保安装了正确版本的 npm (npm --version)
                  4. 取消注释 $HOME/.npmrc 中的前缀行
                  5. 继续在您的主文件夹中安装您的全局包!

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2023-01-27
                    • 1970-01-01
                    • 1970-01-01
                    • 2016-08-14
                    相关资源
                    最近更新 更多