使用分发节点js软件包(Ubuntu)将NPM安装到主目录中


93

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

这似乎有些挑剔,但这对于使用Windows的开发人员在Linux下设置语言运行时/库环境是一种非常习惯的方式:针对运行时的发行版程序包,每个用户环境中的第三方库(请参阅virtualenv,RVM-RVM如果需要,还将为您构建Ruby)。如有必要,我将在本地构建节点,但这是一个PITA,因为节点已成为许多项目的附带开发要求。


Answers:


200

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

通过chris-lea PPA安装Nodejs和NPM。然后,我在homedir中设置一个软件包根目录,以保存Node“ global”软件包:

 $ 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/binPATH

只需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

2
如果您使用的node是已安装但未安装的共享系统npm,请按照上述答案中的设置进行操作,然后npm_config_prefix=$NPM_PACKAGES curl -L https://npmjs.org/install.sh | shnpm其安装在主目录中。
蒂姆·刘易斯

1
前缀集在npm 2.10.1上对我不起作用,所以我最终运行了npm config set prefix $NPM_PACKAGES
Calin

以下脚本声称可以自动执行此操作:github.com/glenpike/npm-g_nosudo
Mike R

我改用$HOME/.local前缀。如今,这是其他软件常用的文件夹,用于存储本地文件。
Vaibhav K '02

2
如果你使用:echo 'prefix = ${NPM_PACKAGES}' >> ~/.npmrc,路径不硬编码.npmrc,但NPM会从环境变量每当NPM运行(注意我改读它"'以防止shell执行从扩大变量的回声,我加入{}周围的变量,因为这是.npmrc。中使用的语法为了使这项工作有效,我确实必须更改.bashrc为:export NPM_PACKAGES="$HOME/.npm-packages"。将其添加export到npm中使之可用。不相关,我认为您也需要添加export其他变量
Matthijs Kooijman

30

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

现在您可以install -g没有sudo,一切都进入~/.nvm/

或在没有nvm的情况下安装Node.js(官方说明):

安装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 

现在,您可以install -gsudo打扰系统文件。


NPM docs网站上也介绍了第二个选项:docs.npmjs.com/getting-started/…–
Vadim

6

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

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

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

4

因为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


3

我使用@ just-jake 解决方案已有一段时间,发现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版本。

    例如,要安装nodejsv4.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

2

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

npm install -g --prefix=$(npm config get prefix) <package>

错误是npm不会读取您的每用户配置文件,但是每次安装全局脚本时都指定该文件即可解决此问题。在这里找到。



0

其他答案已经过时了:2020年的解决方案是使用NPM_CONFIG_PREFIX环境变量。(查看详细信息

例如,

$ 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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.