更新 npm 到它的最新版本 npm@5.2.0
的话,可能注意到在通常的 npm:
npx
下,它安装了一个二进制包。
npx 是一个用于完善从 npm 注册中使用包的体验的工具——同样的,npm 在安装和管理注册的依赖上比较容易,npx在使用 CLI 和在注册的其他可执行脚本比较容易。它简化了很多事情,目前,需要一些平时 npm 的套路。
不用 npm run-script 使用本地安装工具
过去几年,npm 生态移动了越来越多的安装工具作为项目本地的 devDependencies
,而不是要求用户全局安装它们。这意味着有些工具像 mocha
,grunt
,bower
,它们曾经主要被全局的安装在系统上,现在在每一个项目的基础上有了自己的版本控制。也就是说,要使基于 npm 的项目启动并运行,你需要做的就是确保系统上有 node + npm,然后 npm it
执行 install
和 test
。因为 npm run-script
添加了本地二进制文件到路径,这恰好起作用!
副作用是你没有快速方便的方式去直接取调用本地二进制文件。有几种方法可以做到,同时都有些令人恼火:你可以给你的 scripts
添加脚本,不过你需要记住通过使用 --
传递参数,你可以用 shel 技巧,像这样 alias npmx=PATH=$ (npm bin): $PATH
,或者你可以只是手动输入路径通过 ./node_modules/.bin/mocha
。这些都起作用,但是都不完美。
npx 给了你我认为做好的方案:使用 本地 安装,$ npx mocha
是你唯一需要做的。如果你有额外的步骤和配置 shell 的自动回调(在这下面更多的情况),那么 $ mocha
在项目目录内部的命令会为你提供技巧!
额外福利,如果调用已经安装的二进制文件,npx 基本上没有开销——它足够聪明去为工具直接到当前运行的 node
进程中加载代码!此类事情都如此快,同时它对于脚本来说是完全可以接受的。
执行一次性命令
你曾经遇到过一个情况是想去试试某个 CLI 工具,但是比较讨厌的是不得不在全局安装只是为了运行一次吗?npx 是为这个而生的。调用 npx <command>
,当 <command>
还不在你的 $PATH
中,将会为你从 npm 注册的名字自动安装包,同时调用它。当它完成,已经安装的包不会在全局的任何地方,所以你不用担心长期污染问题。
这个特性对于像生成器而言的东西来说是理想的。像是 yeoman
的工具或者 create-react-app
很久也不会调用一次。这个时候你再运行它们,它们可能已经过期了,所以每次不得不执行安装,每次你想用任何方式使用它们的时候。
作为一个工具维护者,我很喜欢这个特性,因为这意味着我只需要在说明的 README.MD
里面添加 $ npx my-tool
就可以,而不是试着让人们客服安装的困难。老实说,说:“哦,只要拷贝这样命令,没有任何问题”对不确定是否使用工具的用户而言更好。
这里有几个有趣的包,你或许想用 npx
试试:happy-birthday
,benny-hill
,workin-hard
,cowsay
,yo
,create-react-app
,npm-check
。这有个完整的 awesome-npx
项目!去试试!一条命令可以得到一个成熟的本地 REST 服务,麻雀虽小,五脏俱全。
在不同的 Node.js 版本下运行命令
npx -p node@<version> node -v
用于在 node 版本下的一次性运行
最终证明,这是一个很酷的注册在 npm 上的工具包,是由 Aria Stewart 创作的 node
。这意味着你可以使用不同的 node 版本很容易的找出 node 命令的结果,而不需要版本管理工具比如 nvm
, nave
或者 n
。所有需要做的事,只是安装 npm@5.2.0
!
npm 的-p
选项允许你指定安装包,同时添加到允许 $PATH
,这意味着你可以做以下有趣的事:$ npx -p node@6 npm it
就像是你在全局运行 node@6
一样,去安装和测试当前 npm 包。我一直在自己使用——甚至最近不得不在项目里大量使用,由于我的一些测试库低于 node@8
后就不运行。它真的是救命神器,而且我发现对于使用场景而言它比版本管理器要容易多了,我总是不知不觉破坏或者丢掉配置。
交互式开发 npm run-scripts
如今很多 npm 用户使用 run-script
的特性。它们不仅分配 $PATH
,比如访问本地二进制文件,而且还在那些脚本中添加了大量环境变量让你可以访问!你可以通过 npm run env | grep npm_
看看那些额外的变量。
这可以有技巧的开发和测试运行脚本——意味着使用这些技巧像 $(npm bin)/some-bin
,直到交互生效,你仍然不能访问那些魔法般的环境变量。
但是等等!npx 却另有高招:当你使用 -c
选项,写进内部字符串的脚本参数将会完全像通常运行脚本一样访问相同的环境变量!你甚至可以使用链式或者多行命令用一行 npx
完成。
与伙伴分享基于 gist 脚本
使用 gist.github.com 去分享工具类脚本变得很常见,而不是设置整个 git 仓库,发布新工具等等。
使用 npx,你可以做到更深一步:因为 npx 接受npm本身所做的任何特定符,你可以创建一个 gist,人们能用一行命令直接调用。
自己试试结果: gist.github.com/zkat/4bc195…
注意:保证安全!当执行这些脚本时,确保阅读过,就像运行 .sh
脚本一样。
额外好处:shell 自动回退
这是一个很棒的特性, Félix Saparelli 添加的,因为这对于大多数使用案例,你永远不需要直接调用 npx
!在常规 npx 用法和回调的不同在于,回调不安装新包,除非你使用 pkg@version
语法。
直接设置自动回调:查阅 npx 文档,为当前 shell 使用命令,添加 .bashrc
/.zshrc
/.fishrc
,然后重启你的shell(或者使用 source
或者其他功能去刷新 shell)。
现在,你可以做 standard@8--version
这样的事,去找出不同版本,同时如果你在 npm 项目内部,$ mocha
将会自动回调本地安装的 mocha 版本,提供的版本没有全局安装。
现场做做看!
你可以通过安装 npm@5.2.0
或者更新的——如果你不想使用 npm,你可以安装稳定版的 npx!它完全兼容其他包管理器,因为任何包使用只是内部操作。而且这里有10种不同语言,归功于来自全世界的早期采用,使用 -- help
所有的系统消息翻译自动基于系统本地语言!这里有一个 awesome-npx
仓库,是个用 npx 工作良好的例子!
你有喜欢的特性吗?有没有使用过?如果你有一些我没有在这里列出来的工具的话,在评论里分享下!我很高兴听到其他人的推荐!