更新 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 工作良好的例子!
你有喜歡的特性嗎?有沒有使用過?如果你有一些我沒有在這裡列出來的工具的話,在評論裡分享下!我很高興聽到其他人的推薦!