如何从全局包运行npm脚本?

时间:2017-07-23 17:09:56

标签: node.js npm

说,我正在制作一个npm包。

示例package.json:

{
   "bin": { "cli": "cli.js" },
   "scripts": { 
    "sample": "node sample.js" 
   } 
}

示例cli.js:

const shell = require('shelljs')
shell.exec('npm run sample')

然后,我运行npm link

现在,如果我从任何地方运行cli而不是项目存储库,它就不会运行。相反,它会引发错误。

我通过将cli.js更改为:

找到了解决方法
const shell = require('shelljs')
, package_path = require('./path.json') 
// I manually created this path.json containing the absolute path of the package

shell.exec('npm run --prefix ${package_path} sample')

这种作品。但主要限制是:

  • 项目的所有贡献者必须在克隆回购后手动设置此路径。

  • 如果包是全局安装的,如npm i -g package,则此路径更改对用户来说很烦人。

我要问的是:

  • 如何自动设置路径?

  • 任何其他更好方式来实现相同的行为,即 从全局npm script脚本调用cli

1 个答案:

答案 0 :(得分:1)

我找到了解决问题的优雅解决方案。

cli.js文件编辑为:

const shell = require('shelljs')
shell.exec(`npm run --prefix ${__dirname} sample`)

Node提供了一些非常有帮助的 facade 全局变量(read here)。

在这里,__dirname是完美的解决方案。它提供了执行脚本的路径。

希望这可以帮助其他任何开发人员。