2015-06-22 33 views
8

我有一個包本身有一個腳本,它的package.json我希望能夠在我的頂級項目中運行。這個包是我的頂級項目依賴項之一。我正在尋找一種方法來直接或間接調用依賴包軟件腳本。如何運行依賴包的npm腳本

讓我們假設我正在使用的模塊名稱爲foo,我要運行的腳本是updateFooData

我嘗試使用語法npm run-script <package> <...>來運行它,但這似乎是不推薦使用的功能,因爲我無法在當前的official documentation中找到它,但我在其他(非常舊的)搜索結果中看到它。

npm run-script foo updateFooData 

# npm ERR! missing script: foo 

我也看着故宮API,並同時npm.commands.run-script(args, callback)會做我想做的,我無法弄清楚如何將模塊加載到故宮

{ 
    ... 
    "scripts":{ 
    "foo:updateFooData": "node --eval \"... ??; npm.commands.run-script('updateFooData', callback)\"" 
    } 
} 

npm run foo:updateFooData 
# Obviously fails 

我發現的唯一的事情那到目前爲止工作是CD到子模塊目錄並從那裏運行npm。這不是我的首選解決方案。

cd node_modules/foo 
npm run updateFooData 

回答

0

東西我發現,做的工作:

如果你正在運行的腳本運行一個腳本文件,你可以看看它的運行文件的路徑和使用需要運行該腳本:

# if node_modules/foo/package.json looks like this 
{ 
    "scripts": { 
    "updateFooData":"scripts/updateFooData.js" 
    } 
} 

# then package.json can look like this 
{ 
    "scripts": { 
    "foo:updateFooData":"node --eval \"require('foo/scripts/updateFooData.js')\"" 
    } 
} 

# or package.json can look like this 
{ 
    "scripts": { 
    "foo:updateFooData":"node node_modules/foo/scripts/updateFooData.js" 
    } 
} 

# and you can run it like this 
npm run foo:updateFooData 

我不喜歡這個解決方案,因爲它只在你運行的npm腳本是一個文件時才起作用。它不會適用於所有

11

我遇到了這個嘗試運行geoip-lite的updatedb腳本。你應該使用npm explore command,它會在依賴目錄中產生一個新的shell。

因此,對於你的使用情況,儘量npm explore foo -- npm run updateFooData

+1

複製粘貼:'NPM探索geoip的 - 精簡版 - NPM updatedb' – aluxian

+2

運行作爲一個謹慎注意,這並不適用於Windows工作https://github.com/npm/npm/issues/8932 – Darly

+1

令人驚歎的是,來到這裏期待自動更新geoip-lite並瞭解有關探索命令。 – dmo