【问题标题】:How do I run an npm script of a dependent package如何运行依赖包的 npm 脚本
【发布时间】:2018-06-22 22:17:00
【问题描述】:

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

假设我正在使用的模块名称为foo,而我要运行的脚本为updateFooData

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

npm run-script foo updateFooData

# npm ERR! missing script: foo

我还研究了 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

到目前为止,我发现唯一可行的方法是将 CD 放入子模块目录并从那里运行 npm。这不是我的首选解决方案。

cd node_modules/foo
npm run updateFooData

【问题讨论】:

    标签: npm


    【解决方案1】:

    我在尝试运行 geoip-lite 的 updatedb 脚本时遇到了这个问题。您应该使用npm explore command,它将在依赖项目录中生成一个新的 shell。

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

    【讨论】:

    • 复制粘贴:npm explore geoip-lite -- npm run updatedb
    • 作为警告,这不适用于 Windows github.com/npm/npm/issues/8932
    • 太棒了,来这里是为了自动更新 geoip-lite 并了解了 explore 命令。
    【解决方案2】:

    注意:

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


    我发现的东西确实有效:

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

    # 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 脚本是一个文件时才有效。它不会适用于所有

    【讨论】:

    • 这不是一个好主意。您无法保证将安装哪个 node_modules 文件夹模块,因为 NPM 会尝试通过在最高级别安装共享包来优化空间。
    • 我认为在我编写此解决方案时这不是真的,但现在是真的。感谢您的信息。
    猜你喜欢
    • 2015-05-07
    • 2015-11-21
    • 2017-11-09
    • 1970-01-01
    • 1970-01-01
    • 2019-09-12
    • 2017-04-08
    • 2017-09-13
    • 1970-01-01
    相关资源
    最近更新 更多