如何找到由我的NPM软件包的依赖项之一安装的二进制文件,以便我可以执行它?

时间:2016-04-29 17:10:42

标签: node.js npm

我有一个取决于node-pg-migrate的NPM包。从我的包中,我需要执行node-pg-migrate的二进制pg-migrate。我正在运行节点0.12.13。

如果我安装了我的软件包的应用程序也不依赖于node-pg-migrate,这是微不足道的。依赖项安装在我的包中的node_modules目录中。

- node_modules
| - my-package
  | - node_modules
    | - node-pg-migrate

这是我在那种情况下会做的事情

exec('./node_modules/node-pg-migrate/bin/pg-migrate up', 
  function(error, stdout, stderr) { 
    // do something
  }
);

但是,如果我正在将我的软件包安装到 的应用程序取决于node-pg-migrate,那么它将安装在应用程序的node_modules目录旁边。< / p>

- node_modules
| - my-package
| - node-pg-migrate

我已经考虑过首先检查我的包node_modules是否为pg-migrate并退出一个级别(如果不存在),但如果我的包是内部依赖关系则会中断。然后,我可能不得不再试一次。

- node_modules
| - node-pg-migrate?
| - some-package
  | - node_modules
    | - node-pg-migrate?
    | - my-package
      | - node_modules
        | - node-pg-migrate?

如何找到pg-migrate二进制文件的位置并运行它,无论它位于依赖关系树的哪个位置?

3 个答案:

答案 0 :(得分:0)

由于您从命令行执行pg-migrate二进制文件,因此建议您全局安装

来自npm-folders documentation

  
      
  • 本地安装(默认):将东西放入当前包根目录的./node_modules中。
  •   
  • 全局安装(使用-g):将东西放入/ usr / local或安装节点的任何位置。
  •   
  • 如果您需要(),请在本地安装。
  •   
  • 如果您要在命令行上运行它,请全局安装它。
  •   
  • 如果您需要两者,请在两个地方安装,或使用npm链接。
  •   

使用全局安装,您不需要打扰安装软件包的位置,并且能够以这种方式执行migrate命令:

exec('pg-migrate up', 
  ...
);

答案 1 :(得分:0)

npm安装指向.bin目录中node_modules中各种可执行文件的链接,因此您无需在特定的子目录中查找它们。

因此,为了达到您需要的路径,您可以简单地执行此操作:

const myExePath = __dirname + '/node_modules/.bin/my-exe';

答案 2 :(得分:0)

const binDir = execFileSync('npm', ['bin']).toString().trim();

exec(binDir + ' pg-migrate up', 
  function(error, stdout, stderr) { 
    // do something
  }
);