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

kal*_*lpa 6 node.js npm

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

示例 package.json:

{
   "bin": { "cli": "cli.js" },
   "scripts": { 
    "sample": "node sample.js" 
   } 
}
Run Code Online (Sandbox Code Playgroud)

示例 cli.js:

const shell = require('shelljs')
shell.exec('npm run sample')
Run Code Online (Sandbox Code Playgroud)

然后,我跑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')
Run Code Online (Sandbox Code Playgroud)

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

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

  • 如果像这样全局安装软件包,npm i -g package那么这种路径更改会让用户感到烦恼。

我要问的是:

  • 如何自动设置路径?

  • 还有其他更好的方法来实现相同的行为,即npm script从全局cli脚本调用 a 吗?

kal*_*lpa 2

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

cli.js文件编辑为:

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

Node 提供了一些非常有用的外观全局变量(请阅读此处)。

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

希望这对其他开发人员有所帮助。