2015-06-22 35 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