2014-11-22 95 views
25

我通常通過npm運行gulp,例如,在我的package.json通過npm自動運行gulp任務

"scripts": { 
    "test": "gulp test", 
    "minify": "gulp minify" 
} 

然後我可以運行命令如

npm run minify 

它是沒問題的,但每次我在我的gulpfile新的任務時,我需要將它們添加到包腳本部分下的.json,有沒有更好的方法來做到這一點?

原因:我唯一的全球安裝NPM我path所以所有其它模塊不會污染我的path,所以我需要通過npm腳本

+0

那麼你爲什麼要使用'NPM run'而不是正常的方式?這個信息可以幫助你知道你真的想要實現什麼 – 2014-11-23 00:07:43

+0

我只在全局安裝npm,所以npm在我的路徑中,我不想吞噬我的路徑,所以我通過npm運行gulp。 – Howard 2014-11-23 08:32:25

回答

28

運行它們有我請客你:我徑自並讓你成爲一個簡單的npm模塊來處理這個問題。

gulp-npm-script-sync

下面是它的要點:

var file = fs.readFileSync(config.path || 'package.json', 'utf-8'); 
    var pkg = JSON.parse(file); 
    var tasks = gulp.tasks; 

    pkg.scripts = pkg.scripts || {}; 

    Object.keys(tasks).forEach(function (t) { 
    pkg.scripts[t] = 'gulp '+tasks[t].name; 
    }); 

full source做這樣的東西寫的package.json回用相同的縮進和東西。

所以是繼續前進:npm install --save-dev gulp-npm-script-sync

棒這在gulpfile:

var gulp = require('gulp'); 
var sync = require('gulp-npm-script-sync'); 

// your gulpfile contents 

sync(gulp); 

每當你用一個新的任務,它會更新你的package.json更新gulpfile。

你甚至可以把它一飲而盡任務中:

gulp.task('sync', function() { 
    sync(gulp); 
} 
+0

很好,謝謝,這很有用 – Howard 2014-11-29 04:31:57

+2

我認爲羅馬下面的答案更加優雅,而且你可以少用一個開發依賴。 – 2017-10-24 12:59:36

+0

我同意。例如,我使用'npm run webpack - --watch'或'npm run webpack - -d'。 – 2018-01-23 02:32:55

20

布賴恩·布倫南給a fantastic suggestion:添加 ./node_modules/.bin$PATH變量。 然後,只要您位於 項目的頂層目錄中,就可以在本地運行 已安裝的實用程序。

來源:Keeping clean

無需全局安裝軟件包即可輕鬆調用它。請記住,上面的路徑應該是前加


另外,由於2.0.0版本,npm提供了額外的參數傳遞給我們的運行命令的能力。這些參數將被簡單地追加到腳本命令中。

在你的情況,從package.json下面的腳本:

"scripts": { 
    "gulp": "gulp" 
}, 

可援引爲npm run gulp -- test,或npm run gulp -- minify

+0

對於那些在Windows下努力安裝'npm @ 2.0.0'的人提示:從node.js文件夾(例如'C:\ Program Files(x86)\ nodejs')執行'npm update npm'。這可能需要管理員權限。 – 2014-12-02 03:57:43

+1

在您的清單中定義腳本的美妙之處在於您創建了一個通用api。 'npm run build'可能會引發吞嚥或咕嚕聲或其他任何事情。隨着項目的發展,您可以更改實施。界面保持不變,並將繼續工作。在這種情況下,您也不需要在$ PATH中添加任何內容,如下所示: '「scripts」:{「build」:「./node_modules/.bin/gulp build」}'。 – 2015-02-18 17:14:55

+0

@Jasper是的,額外的間接水平可以提供好處。但是,通常不需要替換構建系統,任何間接方法都會產生成本。就個人而言,我更喜歡在項目中使用'gulp'接口時直接調用它,而不將它與其他任何項結合或引入一個接口來隱藏另一個接口。 'grunt'和'npm'也是如此。另外,我不喜歡我的答案中的第二個選項,它僅包含共享信息。至於第一個選項,它允許我以一種優雅和非常強大的方式避免在全球範圍內安裝軟件包。 – 2015-02-18 17:50:26