npm 进阶

是时候全面总结一下的npm使用了

Posted on June 6, 2015

安装/更新

  • sudo npm install npm -g 更新npm

    或者wget http://npmjs.org/install.sh; sh install.sh

  • ng npm permissions https://docs.npmjs.com/getting-started/fixing-npm-permissions

  • nmp install

    • 可以带上版本如 npm install [email protected] npm install [email protected] -g

    • 如果没有指定版本, 将选择符合当前目录中package.json 要求范围的最新版本, 如果没有package.json, 将安装最新版本

      安装之前,npm install会先检查,node_modules目录之中是否已经存在指定模块。如果存在,就不再重新安装了,即使远程仓库已经有了一个新版本,也是如此。

      如果你希望,一个模块不管是否安装过,npm 都要强制重新安装,可以使用-f或–force参数: npm install <packageName> --force

    • 问题: 怎么保证不同机器不同时期的依赖一直性, 没有类似ruby 的Gemfile.lock ????

    • npm install 包名 --save 这些选项会将指定的模块添加到package.json的dependencies( –save-dev devDependencies)清单中

    • npm install --production 将不会安装devDependencies里的依赖

    • install 可以简写为 i

  • 如果相同的包在上层node_modules已经安装了, npm将重用, 而不是在子node_modules里重复安装, 这对开发环境也是一样

    只要上层node_modules的包满下层的依赖需要, 下层就不会重复安装, 这种情况下层不会考虑最新版本

  • npm uninstall

    npm uninstall lodash

    npm uninstall --save lodash

    npm uninstall -g jshint 全局包卸载

  • npm update [包]

    它会先到远程仓库查询最新版本,然后查询本地版本。如果本地版本不存在,或者远程版本较新,就会安装

    更新过时的包, 获得符合约束的最新的包, 对于npm outdated 红色输出有效

    不带包名的话, 更新所有过时包

    npm update [-g] [包名] 如果没有包名, 则更新全部本地(无-g)或者全局包(-g)

  • 全局安装模式:

    1. 把包放到path.resolve(process.execPath, '..', '..', 'lib', 'node_modules')/usr/local/lib/node_modules
    2. 在node可执行文件同目录下, 创建一个连接文件, 指向步骤1中package.json中bin执行的文件, 如/usr/local/bin/express -> ../lib/node_modules/express-generator/bin/express
    • 全局包安装在 {prefix}/lib/node_modules
    • 可执行的全局包将链接到{prefix}/bin
    • 全局包man page 链接到{prefix}/share/man
  • npm root -g 查看全局包安装路径, 即全局安装模式中的目录
  • ~/.npmis a cache that npm uses to avoid re-downloading the same package multiple times
  • npm cache clean 清除本地包缓存

信息查看

  • npm info 包 version 查看该包最新的版本

  • npm ls npm list (递归)树状列出当前项目的包(依赖关系)

    UNMET DEPENDENCY 错误表示有的依赖包没安装, 常见于npm uninstall 包 后没有删除package.json中的依赖声明

    extraneous 表示本地多的包, 没在package.json中声明的多余包, 常见于npm install 包后没有在package.json中声明依赖

    npm ls -g 查看全局包安装情况

    npm ls 包名 查看当前安装包

  • npm outdated 查看过时的包

    Package(包名) Current(当前使用版本) Wanted(符合package.json要求的最新版本) Latest Location(最新版本)

    包名颜色: 红色: Wanted大于Current, 黄色: Wanted等于Current但Latest Location大于Current

    npm outdated -g --depth=0 查看全局过时包


包创建

  • npm init

    通过询问name, version, description, entry point 等等创建package.json

    author的格式可以使Your Name <[email protected]> (http://your_intro_web.com)

  • npm adduser

    通过询问Username, Email, password等创建npm用户

    保存成功会在.npmrc中存储2句话用于校验, 如:

      _auth = emhvbmdodWF0ZXN0MTp6aG9uZ2h1YXRlc3Qx
      email = [email protected]
    
  • npm publish

    只要package.json里有name和version, 就可以发布

    需要改变version, 才能再次发布, 就是更新

  • scoped packages

    [TODO] https://docs.npmjs.com/getting-started/scoped-packages


配置

  • 配置文件优先级:

    per-project config file (/path/to/my/project/.npmrc) 权限必须是0600,否则忽略
    per-user config file (~/.npmrc) 权限必须是0600,否则忽略 通过`npm config get userconfig` 获得
    global config file ($PREFIX/etc/npmrc) 通过`npm config get globalconfig` 获得
    npm builtin config file (/path/to/npm/npmrc)
    
  • npm config ls -l

  • prefix

    prefix影响npm -g 安装到哪里, prefix默认是bin/node所在的目录, 大部分系统是 /usr/local

  • npm config edit 会把default的配置也移动到.npmrc里, 但之后的一些npm操作又会把默认值去掉

命令行设置

  • npm config set registry "http://registry.npmjs.org/" 会设置到user 配置

Cache

应该是用于本地重复安装时提供缓存

本地包缓存存于npm config get cache, 存储结构{cache_dir}/{name}/{version}

  • npm cache ls [包名]
  • npm cache clean [包名]

Version

If a project is going to be shared with others, it should start at 1.0.0

(不能向下兼容的改动, 大的发布).(不影响原有功能的新特性, 小改动).(bug修复, 微小改动, 补丁)

{ "dependencies" :
  {
  , "a" : "=1.0.0" // 等号可以省略
  , "b" : "1.0.0"  // 默认是等于

  , "c" : "<1.0.0"
  , "d" : "<=1.0.0"
  , "e" : ">1.0.0"
  , "f" : ">=1.0.0"

  , "g" : "1.0.0 - 2.9.9" // 左闭右闭, 等价于 ">=version1 <=version2"
  , "h" : ">=1.0.2 <2.1.2"
  , "i" : ">1.0.2 <=2.3.4"
  , "j" : "<1.0.0 || >=2.3.1 <2.4.5 || >=2.5.2 <3.0.0" // 只要满足其中一个范围

  , "k" : "git://github.com/user/project.git#master" //git, 默认tag是master
  , "l" : "visionmedia/express" //github?
  , "m" : "file:../foo/bar"

  , "n" : "1.x" // 等价于 >=1.0.0 <2.0.0 (Matching major version)
  , "o" : "1.2.x" // 等价于 >=1.2.0 <1.3.0 (Matching major and minor versions)
  , "p" : "1" // 等价于 1.x.x, 等价于 >=1.0.0 <2.0.0
  , "q" : "1.2" // 等价于 1.2.x, 等价于 >=1.2.0 <1.3.0

  // ~ 如果有小版, 本允许patch版本浮动, 如果没有小版本, 允许小版本浮动
  , "r" : "~1.2.3" // 等价于 >=1.2.3 <1.(2+1).0, 等价于>=1.2.3 <1.3.0 最后一个版本向上浮动
  , "s" : "~1.2" // 等价于 >=1.2.0 <1.(2+1).0 等价于 >=1.2.0 <1.3.0 (Same as 1.2.x) 最后一个版本浮动
  , "t" : "~0" // 等价于 >=0.0.0 <(0+1).0.0, 等价于 >=0.0.0 <1.0.0 (Same as 0.x)

  // ^ 只要不改变最左不为零的版本, 其他版本任意浮动
  , "u": "^1.2.3" // >=1.2.3 <2.0.0
  , "v": "^0.2.3" // >=0.2.3 <0.3.0
  , "w": "^0.0.3": // >=0.0.3 <0.0.4

  , "x" : "*" // 任一版本, 等价于>=0.0.0
  , "y" : "latest"
  }
}

其他

  • nmp start 通过package.json里的scripts.start指向的脚本启动任务

  • npm whoami 查看当前npm用户, 没有网络开销

  • 如果某个包已经安装, 但是他的依赖没有安装, 在顶层npm isntall不会安装改包的依赖, 需要删掉改包, 重新npm install

  • 关于缓存机制和安装原理可参考阮大侠的总结 npm 模块安装机制简介

  • npm link npm unlink

    koa_scaffold %  npm link
    这是第二步, 全局命令指向全局包中的命令
    /usr/local/bin/newkoa -> /usr/local/lib/node_modules/koa_scaffold/bin/newkoa.js
    这是第一步, 创建全局包指向本地包
    /usr/local/lib/node_modules/koa_scaffold -> /Users/zhonghua/code/node/koa_scaffold
    此时newkoa可运行
    koa_scaffold % npm unlink
    unbuild [email protected]
    解绑以后全局命令还在, 但是...
    koa_scaffold % ls /usr/local/bin/newkoa
    /usr/local/bin/[email protected] -> ../lib/node_modules/koa_scaffold/bin/newkoa.js
    全局包已经不在了, 所以全局命令也不能执行了
    koa_scaffold % ls /usr/local/lib/node_modules/koa_scaffold
    ls: /usr/local/lib/node_modules/koa_scaffold: No such file or directory
    

参考

  • http://www.cnblogs.com/huang0925/archive/2013/05/17/3083207.html

备忘: 玩转npm