更改npm全局包安装目录的解决方案

npm可以把包安装到全局,也可以安装到本地,但是对于工具类的包通常是在命令行中作为命令使用,如果不安装到全局的话,则在执行相应工具的命令时必须加上命令的路径,很不方便;如果安装到全局的话,对于像我这样有强迫症的人是很不喜欢把乱七八糟的东西放在系统级目录下的;为了解决这个问题,我研究了几个方案,通过这几个方案均能实现即不把包安装到全局,又能在命令行中方便地使用;如下:

背景知识


1. 命令的查找目录

(详情请参考《Shell终端命令行的重点知识》)
当在终端直接输入命令时,如:guobinyongMac:~ guobinyong$ ls,系统会在一些指定的目录中查找相应命令的可执行文件,然后执行查找到的可执行文件;如果命令的可执行文件不在默认的目录中,则需要在输入命令时写出命令的路径,如:
假设我需要执行命令gby,而gby文件在目录./PATH/下,则需要这样输入命令:

guobinyongMac:~ guobinyong$ ./PATH/gby

这样是不太方便的,如果不想输入命令的路径,则可以把命令的所在目录配置为终端的命令查找目录;
如何配置呢?通过PATH变量!
PATH变量中保存的是命令查找路径的列表,目录之间用冒号 : 分隔;配置方法如下:
在终端的配置文件~/.bash_profile(如果不存在,则创建该文件)中添加如下代码:

export PATH=$PATH:新的路径     //把您要添加的路径写在$PATH:后面

2. 目录前缀配置参数prefix

(详情请参考《npm常用技巧》)
prefix参数指定全局安装时相关目录的共同路径,即全局安装的根目录;
可以通过如下命令配置prefix参数:

npm config set prefix <路径> [-g|--global]  //给配置参数key设置值为value;

配置prefix参数后,当再对包进行全局安装时:
包会被安装到如下位置:

Unix系统:{prefix}/lib/node_modules
Mac系统:{prefix}/lib/node_modules
Windows系统:{prefix}/node_modules

并且,会把可执行文件链接到如下位置:

Unix系统:{prefix}/bin
Mac系统:{prefix}/bin
Windows系统:{prefix}

手册页会被安装到如下位置:

Unix系统:{prefix}/share/man
Mac系统:{prefix}/share/man
Windows系统:在Windows系统中也不会安装手册页;

注意:
Mac系统也属于Unix系统,所以Mac系统的安装路径与Unix系统一样;

方案1:配置npm的目录前缀配置参数prefix


此方案的思路:
更改npm全局安装的路径为路径A,然后再把路径A添加到终端的命令查找路径列表中;
具体操作如下:

  1. 创建全局包的安装目录pathG;
  2. 配置npm的目录前缀配置参数prefix的值为自定义的目录pathG;
    guobinyongMac:~ guobinyong$ npm config set prefix pathG
    
  3. 把自定的目录中的可执行文件的路径添加到终端的命令查找目录列表中;
    因为全局安装的包的可执行文件会被自动链接到pathG/bin目录下,所以要把pathG/bin目录添加为终端的命令查找目录,具体配置为:
    在终端的配置文件~/.bash_profile(如果不存在,则创建该文件)中添加如下代码:
    export PATH=$PATH:pathG/bin
    
  4. 重启终端;

此方案的优点:

  1. 在任何目录下都可以把包安装到此方案配置的目录中,只需要在安装命令中加上全局选项-g
  2. 可以安装手册页;

此方案的缺点:

  1. 此方案替换了npm默认的全局安装方案(与方案2相比);
  2. 当更新npm时,新版本的npm也会被安装到配置的目录中;并且不会覆盖在系统目录下的npm;

方案2:配置命令查找路径PATH为指定目录


此方案的思路:
把包以本地安装的方式安装到一个目录中,然后把包的安装目录添加进终端的命令查找路径中;
具体步骤如下:

  1. 创建安装包的目录;
  2. 以本地安装的方式安装相应的包;
    guobinyongMac:~ guobinyong$ npm install  包名
    
  3. 给终端添加命令查找目录:
    因为本地安装的包的可执行文件会被自动链接到node_modules/.bin目录下,所以要把node_modules/.bin目录添加为终端的命令查找目录,具体配置为:
    在终端的配置文件~/.bash_profile(如果不存在,则创建该文件)中添加如下代码:
    export PATH=$PATH:安装目录/node_modules/.bin 
    
  4. 重启终端;

此方案的特点(不是优点):

  1. 此方案安装的包是本地包,不是全局包;即可以以全局包的使用方式使用本地包;

此方案的优点:

  1. 此方案不会覆盖全局安装方案,即不会更改全局安装的配置,相当于给npm又提供了一种新的安装方案;
  2. 有package.json文件,在更换电脑时,方便恢复安装包;
  3. 不影响npm的更新;

此方案的缺点:

  1. 只能在此方案配置的目录下安装包;
  2. 不会安装手册页;

方案3:配置命令查找路径PATH为项目目录


此方案的思路:
因为对于本地安装的包的可执行文件会被链接到项目目录下的 node_modules/.bin/ 目录下,而Shell变量PWD中保存的是当前目录,所以可以动态地配置终端的查找路径为当前项目下的 node_modules/.bin/ 目录;

具体步骤如下:

  1. 给终端添加命令查找目录:
    因为本地安装的包的可执行文件会被自动链接到 node_modules/.bin 目录下,并且Shell变量PWD里保存的是当前所在的目录,所以可以通过 $PWD/node_modules/.bin/ 来找到本地安装的包的可执行文件的链接,所以要把 $PWD/node_modules/.bin/ 目录添加为终端的命令查找目录,具体配置为:
    在终端的配置文件~/.bash_profile(如果不存在,则创建该文件)中添加如下代码:

    export PATH=$PATH:$PWD/node_modules/.bin/
    
  2. 开启终端的启动服务:
    因为终端只会在新的环境启动时读取终端配置文件(如:.bash_profile),所以启动后Shell变量PATH的值不会自动根据变量PWD更新,并且,如果直接打开终端应用,终端的PWD是用户目录 ~,所以如果以直接打开终端应用方式打开终端,即使再用cd命令转到项目目录,变量PATH也不会正确地指向项目中的 node_modules/.bin目录;
    为了能让终端可以在任意目录下启动,需要开启终端的1个或2个服务;开启方法如下:

    1. 打开:系统偏好设置/键盘/快捷键/服务
    2. 勾选 新建位于文件夹位置的终端标签 或者 新建位于文件夹位置的终端标签
      如下图:
      终端服务.png
  3. 在项目目录上(node_modules的父级目录)通过右键的服务菜单打开终端;
    如下图:

    打开终端.png

此方案的特点(不是优点):

  1. 此方案安装的包是本地包,不是全局包;即可以以全局包的使用方式使用本地包;

此方案的优点:

  1. 对于任何包都不需要全局安装,只需要安装到项目中即可,但对于可执行文件又具有全局包的方便;
  2. 有package.json文件,在更换电脑时,方便恢复安装包;
  3. 不影响npm的更新;

此方案的缺点:

  1. 不会安装手册页;

方案4:创建npm的链接


此方案的思路:
给本地的安装的包创建一个到全局目录下的符号链接;(详情请参考《[终端常用技巧][]》)
具体步骤如下:
在相应的本地包的目录下执行以下命令:

guobinyongMac:~ guobinyong$ npm link

此方案的特点(不是优点):

  1. 此方案安装的包是本地包,不是全局包;即可以以全局包的使用方式使用本地包;
  2. 不影响npm的更新;

此方案的优点:

  1. 安装包可以安装在任何目录下;

此方案的缺点:

  1. 会在电脑的全局环境中生成链接,对电脑的全局环境仍有一点点的污染;
  2. 不会安装手册页;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容