2017-05-18 132 views
16

我跑npm installmy sample project's根文件夾中package.json使用腳本來構建它。最佳實踐@> = 4

構建需要在prepublish腳本幾個transpilation目前的步驟,但NPM版本4只顯示一個警告,即重大更改快到了,導致我相信prepare生成事件的腳本是更長遠的證明。

C:\code\antlr4ts-json>npm install 
npm WARN prepublish-on-install As of [email protected], `prepublish` scripts will run only for `npm publish`. 
npm WARN prepublish-on-install (In [email protected] and previous versions, it also runs for `npm install`.) 
npm WARN prepublish-on-install See the deprecation note in `npm help scripts` for more information. 
... 

不幸的是,簡單地從prepublishprepare休息向後兼容移動腳本:如果有人使用[email protected]運行npm install,在prepare構建步驟會被忽略。

升級我的構建時腳本的最佳做法是什麼?理想情況下,我想更新我的package.json使得npm install作品任何NPM @> = 3,但是可替換地產生指示一個明確的錯誤信息NPM @> = 4在需要時npm install使用運行在npm @ 3將是完全可以接受的。

Bakground:我試過包括

"engines": { "npm": ">=4.0.0" }, 

感謝@toomuchdesign(及其他),我明白了爲什麼這並不做我想做的; engines只在我的包安裝時檢查作爲依賴關係,而不是某人從源建立它。這就說得通了。

我跟蹤了此計劃更改的背景,降至npm issue #10074,這解釋了爲什麼需要重大更改。不過,我仍然不清楚如何更好地處理過渡。

+0

我已經更新了這個問題,這樣可以很清楚我在尋找最好的做法在這裏。我還更新了它,指向一個更簡單的示例項目https://github.com/BurtHarris/antlr4ts-json –

+0

更正了示例項目URL:https://github.com/BurtHarris/antlr4ts-json –

+0

注意:I現在已經將我的解決方案投入到示例項目中。 –

回答

8

我發現了一個更好的解決方案,使用check-node-version;該軟件包具有命令行界面,使其易於用於此目的。下面是我建議的最佳實踐的步驟:

  1. 添加與npm install -D [email protected]發展的依賴,
  2. 重命名現有prepublish腳本prepare
  3. 添加替換prepublish腳本來處理向後兼容性,並建議升級NPM(見下文)

的package.json現在看起來是這樣的:

"scripts": { 
    "prepare": "npm run antlr4 && tsc", 
    "prepublish": "check-node-version --npm \">=4\" || npm run prepare", 
    "antlr4": "rimraf gen && antlr4ts Json.g4 -o gen -visitor", 
    ... 
}, 
"devDependencies": { 
    "check-node-version": "^1.1.2", 
    ... 

採用這種方法:

  • npm install始終運行prepare腳本,即使安裝[email protected]。如果[email protected]安裝這應該大概是正常工作(未經測試)。

  • [email protected]甚至還有關於升級NPM一個有用的信息,但因爲腳本使用|| npm run prepare模擬更高版本的問題,將腳本錯誤後繼續。

  • 如果我後來想要對[email protected]採取嚴格的依賴關係,則刪除|| npm run prepare部件會導致腳本在[email protected]上運行時停止。

下面是構建看起來像使用[email protected]

C:\code\antlr4ts-json>npm i 

> [email protected] prepublish C:\code\antlr4ts-json 
> check-node-version --npm ">=4" || npm run prepare 

node: v6.9.1 
npm: v3.10.10 
Error: Wanted npm version ">=4" (>=4.0.0) 
To install npm, run `npm install -g [email protected]>=4` 

> [email protected] prepare C:\code\antlr4ts-json 
> npm run antlr4 && tsc 
+0

也許更好的我發現['check-node-version'](https://github.com/parshap/check-node-version#readme)已經包含了一個可以檢查npm版本的CLI ... –

+0

但是,該版本檢查和「準備」腳本不會壓制警告。如果能擺脫它們也是件好事。 –

+0

是的。但是,這將在npm上發生變化。 –

0

NPM docs狀態engines領域投下只有當你的包被安裝爲一個依賴的錯誤:

,除非用戶設置engine-strict配置標誌,[引擎]字段是諮詢只會當產生警告你軟件包作爲依賴項安裝。

作爲該項目的開發人員/ mantainer,您不應該看到來自您的engines字段的任何警報。

由於只有在運行npm install時需要編譯文件,因此可以簡單地使用postinstall鉤子。

另請注意,prepublish是留下來的,它只會改變其在[email protected]上的行爲,僅在publish掛鉤之前觸發。

+0

好的,這就解釋了爲什麼使用'engines'字段不起作用,但是當有人在我的項目文件夾中運行'npm install'時,我仍然在尋找一種最佳實踐來要求* npm> v4 *。 –

+0

謝謝。我編輯了問題描述,以澄清我正在尋找解決方案,而不僅僅是解釋。 –

+0

我明白你的意思了!我更新了我的答案。 –