我有一个取决于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
二进制文件的位置并运行它,无论它位于依赖关系树的哪个位置?
答案 0 :(得分:0)
由于您从命令行执行pg-migrate
二进制文件,因此建议您全局安装
- 本地安装(默认):将东西放入当前包根目录的./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
}
);