使用分发nodejs包(Ubuntu)将NPM安装到主目录中

Eri*_*sel 84 node.js npm

我想使用分发Node.js包(或者更新版本的chris-lea ppa),但是将NPM安装到我的主目录.

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

第二个链接似乎可能适用于分发nodejs包,但它看起来很粗略.

更新 此粘贴总结了上面的第二个链接,但对我不起作用(似乎npm忽略〜/ .npmrc,至少在安装期间).

Jus*_*ake 191

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

通过chris-lea PPA安装Nodejs和NPM.然后我在homedir中设置了一个包根,以保存Node"global"包:

 $ NPM_PACKAGES="$HOME/.npm-packages"
 $ mkdir -p "$NPM_PACKAGES"
Run Code Online (Sandbox Code Playgroud)

设置NPM以将此目录用于其全局程序包安装:

 $ echo "prefix = $NPM_PACKAGES" >> ~/.npmrc
Run Code Online (Sandbox Code Playgroud)

通过将以下内容添加到.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"
Run Code Online (Sandbox Code Playgroud)

现在,当您执行此操作时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
Run Code Online (Sandbox Code Playgroud)

  • 如果您在安装了`node`但没有安装`npm`的共享系统上,请按照上述答案中的设置,然后`npm_config_prefix=$NPM_PACKAGES curl -L https://npmjs.org/install.sh | sh` 将 `npm` 本身安装在你的主目录中。 (2认同)
  • 如果使用:`echo'prefix = $ {NPM_PACKAGES}'>>〜/ .npmrc`,路径不会在`.npmrc`中硬编码,但是当npm运行时,npm将从环境变量读取它(注意我改变了` "`````为了防止执行echo的shell扩展变量,我在变量周围添加了`{}`,因为这是`.npmrc`中使用的语法.为了使这个工作,我我必须将`.bashrc`更改为:`export NPM_PACKAGES ="$ HOME/.npm-packages"`.添加`export`使其可用于npm.不相关,我认为你需要添加`export`到其他变量也是如此. (2认同)

Max*_* R. 26

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
Run Code Online (Sandbox Code Playgroud)

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

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

安装Node.js.

将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
Run Code Online (Sandbox Code Playgroud)

或者替换.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 
Run Code Online (Sandbox Code Playgroud)

现在你可以install -g不用sudo和不用弄乱你的系统文件了.


use*_*401 6

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

虽然bug已经解决,但您可以按照以下步骤降级到npm 1.4.10:

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


dno*_*zay 5

因为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
Run Code Online (Sandbox Code Playgroud)

自述文件相当不错:https//github.com/ekalinin/nodeenv