浅析npm与yarn全局包的区别

作者:杨润炜
日期:2019/11/8 16:26

浅析npm与yarn全局包的区别

yarn与npm怎样装全局包

  1. yarn global add package;
  2. npm i package --g;

注:npm在普通用户下要用sudo

问题:为什么yarn和npm装全局包产生的效果是一样的吗?

我们都知道yarn是npm的cli,但一直以为yarn安装的时候跟npm产生的效果一样,这个一样是指安装了本地包就本地使用,全局包就可以像npm安装后用命令行使用,但实际结果却是不一样的。
其实从命令执行的权限来看就不一样了,平时用的时候,yarn不用sudo,npm需要用sudo,这其中产生的结果肯定不一样。

下面用几个例子说明一下:
例如用npm装pm2的包,并用yarn和npm查看全局包;

  1. sudo npm i pm2 -g
  2. npm l -g --depth=0
  3. yarn global list

npm会显示用pm2这个包,yarn却不会;

  1. yarn global add webpack
  2. npm l -g --depth=0
  3. yarn global list

同样用yarn安装了全局包,在npm的全局包上查看不到。

找到了答案

来自yarn global的文档:

注:不像 npm 里的 —global 标志,global 是一个必须跟在 yarn 后面的命令。 输入 yarn add global package-name 会把名为 global 和 package-name 的包添加到本地,而非全局添加 package-name。

意思是yarn global只是把package安装在本地,但项目却可以像全局包一样使用,这样也可以减少项目的更新对全局依赖的影响。但也可以通过prefix装包装到系统全局,就跟npm一样了。不愧是几个大厂搞出来的管理工具,考虑得很全面。

另外填上最近踩的一个坑

我们用pm2 deloy作部署发布脚本,大概如下:

  1. {
  2. "apps" : [{
  3. "name" : "HTTP-API",
  4. "script" : "http.js"
  5. }],
  6. "deploy" : {
  7. "production" : {
  8. "user" : "ubuntu",
  9. "host" : ["192.168.0.13"],
  10. "ref" : "origin/master",
  11. "repo" : "git@github.com:Username/repository.git",
  12. "path" : "/var/www/my-repository",
  13. "post-deploy" : "yarn install; pm2 start pm2.json",
  14. "env": {
  15. "NODE_ENV": "production"
  16. }
  17. }
  18. }
  19. }

首先项目里有devDependencies,打包需要安装这些包。然后部署的时候就出现问题了,一直提示devDependencies里的某个包不存在,但手动跑deploy里的命令却是正常的。后来才发现env里指定了NODE_ENV为production,导致yarn不安装devDependencies里的包。
再次引用文档说明:

yarn install —production[=true|false]
如果 NODE_ENV 环境变量设为 production,Yarn 将不安装任何列于 devDependencies 的包。 使用此标志指示 Yarn 忽略 NODE_ENV 并用它取代“生产”与否的状态。

所以解决方法就是将post-deploy改为

  1. yarn install --production=false; pm2 start pm2.json

参考

yarn install
yarn global

感谢您的阅读!
如果看完后有任何疑问,欢迎拍砖。
欢迎转载,转载请注明出处:http://www.yangrunwei.com/a/98.html
邮箱:glowrypauky@gmail.com
QQ: 892413924