如何运行依赖包的npm脚本

Nat*_*ate 15 npm

我有一个包本身有一个脚本package.json,我希望能够在我的顶级项目中运行.这个包是我的顶级项目依赖项之一.我正在寻找一种直接或间接调用依赖包脚本的方法.

让我们假设我正在使用的模块名称已命名foo,我想运行的脚本是updateFooData.

我尝试使用语法npm run-script <package> <...>来运行它,但这似乎是不推荐使用的功能,因为我在当前的官方文档中找不到它,但我在其他(非常旧的)搜索结果中看到它.

npm run-script foo updateFooData

# npm ERR! missing script: foo
Run Code Online (Sandbox Code Playgroud)

我也查看了npm api,虽然npm.commands.run-script(args, callback)我会做我想要的,我无法弄清楚如何将模块加载到npm

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

npm run foo:updateFooData
# Obviously fails
Run Code Online (Sandbox Code Playgroud)

到目前为止,我发现的唯一的工作是CD进入子模块目录并从那里运行npm.这不是我的首选解决方案.

cd node_modules/foo
npm run updateFooData
Run Code Online (Sandbox Code Playgroud)

Cez*_*ski 18

我试图运行geoip-lite的updatedb脚本.您应该使用npm explore命令,它将在依赖项目录中生成一个新shell.

所以对于你的用例,试试吧 npm explore foo -- npm run updateFooData

  • 作为警示,这不适用于Windows https://github.com/npm/npm/issues/8932 (2认同)

Nat*_*ate -1

笔记:

\n\n
\n

这不是一个好主意。您无法保证哪个 node_modules 文件夹模块将安装在中,因为 NPM 将尝试通过在可能的最高级别安装共享包来优化空间。\xe2\x80\x93 @superluminary

\n
\n\n
\n\n

我发现一些确实有效的东西:

\n\n

如果您正在运行的脚本运行一个脚本文件,您可以查看它正在运行的文件的路径并使用 require 运行该脚本:

\n\n
# if node_modules/foo/package.json looks like this\n{\n  "scripts": {\n    "updateFooData":"scripts/updateFooData.js"\n  }\n}\n\n# then package.json can look like this\n{\n  "scripts": {\n    "foo:updateFooData":"node --eval \\"require(\'foo/scripts/updateFooData.js\')\\""\n  }\n}\n\n# or package.json can look like this\n{\n  "scripts": {\n    "foo:updateFooData":"node node_modules/foo/scripts/updateFooData.js"\n  }\n}\n\n# and you can run it like this\nnpm run foo:updateFooData\n
Run Code Online (Sandbox Code Playgroud)\n\n

我不喜欢这个解决方案,因为它只有在您运行的 npm 脚本是一个文件时才有效。它并不适用于所有情况

\n