npm 5.4 安裝某些 package 的時候報錯 "Error: EPERM: operation not permitted"。
事件緣由與經(jīng)過
這一節(jié)講述我遇到 bug 的經(jīng)過,如果你只關(guān)注水星逆行,可以直接跳到下一節(jié)。
2017年8月22日,npm 5.4.0 新版發(fā)布,此時正處于水星逆行期。
2017年9月4日,我把自己電腦的 npm 更新到這個最新版本 5.4.0。
2017年9月9日,我無論安裝任何 npm 包,都報這個錯:
我的項目路徑>npm install
npm ERR! path 我的項目路徑\node_modules\fsevents\node_modules\abbrev\package.json
npm ERR! code EPERM
npm ERR! errno -4048
npm ERR! syscall unlink
npm ERR! Error: EPERM: operation not permitted, unlink '我的項目路徑\node_modules\fsevents\node_modules\abbrev\package.json'
npm ERR! at Error (native)
npm ERR! { Error: EPERM: operation not permitted, unlink '我的項目路徑\node_modules\fsevents\node_modules\abbrev\package.json'
npm ERR! at Error (native)
npm ERR! stack: 'Error: EPERM: operation not permitted, unlink \'我的項目路徑\\node_modules\\fsevents\\node_modules\\abbrev\\package.json\'\n at Error (native)',
npm ERR! errno: -4048,
npm ERR! code: 'EPERM',
npm ERR! syscall: 'unlink',
npm ERR! path: '我的項目路徑\\node_modules\\fsevents\\node_modules\\abbrev\\package.json' }
npm ERR!
npm ERR! Please try running this command again as root/Administrator.
npm ERR! A complete log of this run can be found in:
npm ERR! 我的系統(tǒng)路徑\AppData\Roaming\npm-cache\_logs\2017-09-09T16_08_04_103Z-debug.log
于是我請教萬能的404網(wǎng)站,發(fā)現(xiàn)這是 npm 5.4.0 的 bug。(Issue 傳送門)

幸運的是,Issue 里面已經(jīng)提供了解決方案,這個 Issue 也已經(jīng)被關(guān)閉。

Issue 太長,解決方案隱藏很深。于是這里附上解決方案吧:

- 刪除項目中的整個兒
node_modules - 把文件
package-lock.json改名為yarn.lock - 運行命令
npm cache clear --force - 把 npm 更新到版本 5.4.1:
npm i -g npm@5.4 - 用選項
--no-optional把node_modules裝回來:npm install --no-optional - 裝其他新的 npm 包的時候,建議也加入選項
--no-optional。
程序員是水星逆行的重災人員
引用一段百度百科的原話:
水星墨丘利是羅馬神話中的信使之神,負責所有信息的傳遞和交流,因此水逆時期通常是文書錯誤、信息丟失、機械故障、交通干擾以及各類細節(jié)相關(guān)問題頻發(fā)的時段。
既然水星負責信息、機械、電,而我們程序員又處于一個與信息、機器、電的關(guān)系非常非常非常密切的行業(yè)當中,水星逆行對我們的影響無疑是比別的行業(yè)要嚴重一點的。
這回 npm 5.4 的 bug 就是一個例子。
另外一個例子是 iPhone 7 和 iOS 10。我記得這倆的發(fā)布日期是去年(2016年)的9月吧,也正處于水星逆行期間。當時我很明智地堅決不換手機,手上的 iPhone 6s+ 堅持用著 iOS 9 用到了今年(2017年)的3月。我記得當時身邊換了 iPhone7 的朋友似乎都對這新手機不太爽(具體哪里不爽忘記了),而當時的 iOS 10 也是有電量的問題(耗電快了、剩20%電量就自動關(guān)機等)。
程序員如何應(yīng)對水星逆行?
以下是我的個人經(jīng)驗:
- 盡量避免在水星逆行期間發(fā)布上線,無法推遲的話,就小心謹慎,多檢查幾遍代碼,避免出錯。
- 像 npm 和 iOS 之類,若是在水星逆行期間發(fā)布的,就先收起自己的好奇心,靜靜地看看別人的使用反饋,確保沒人抱怨了才更新。
- 水星逆行期間,與產(chǎn)品同學pk項目排期時,盡量多給自己爭取一點緩沖時間,防止開發(fā)過程中出現(xiàn)意外bug。
這個app很值得大家學習:

水星逆行每年有3次,每次大約20天左右。其實水星逆行是常見的天文現(xiàn)象,在占星學中也只是影響一些瑣碎的事,但是若不對小事多加關(guān)注,就很容易踉成大事。
水星逆行具體在什么時候?這問題用不著問我啊,程序員請找萬能的404,其他童鞋請找度娘。