簡體   English   中英

如何找到由NPM軟件包的某個依賴項安裝的二進制文件,以便可以執行它?

[英]How do I locate a binary installed by one of my NPM package's dependencies so I can execute it?

我有一個依賴於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目錄中。

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

我考慮過先檢查程序包的node_modules是否存在pg-migrate ,然后在不存在的情況node_modules一個級別,但是如果我的程序包是內部依賴項,那將導致崩潰。 然后,我可能不得不再嘗試一個級別。

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

我如何找到pg-migrate二進制文件的位置並運行它,無論它位於依賴樹的何處?

由於您是從命令行執行pg-migrate二進制文件,因此建議您全局安裝

npm-folders文檔中

  • 本地安裝(默認):將內容放入當前軟件包根目錄的./node_modules中。
  • 全局安裝(帶-g):將內容放入/ usr / local或安裝節點的任何位置。
  • 如果您需要require(),請在本地安裝。
  • 如果要在命令行上運行它,請全局安裝它。
  • 如果兩者都需要,則將其安裝在兩個地方,或使用npm鏈接。

使用全局安裝,您無需打擾軟件包的安裝位置,並且能夠以這種方式執行migration命令:

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

npm在.bin目錄中的node_modules中安裝指向各種可執行文件的鏈接,因此您無需在特定的子目錄中查找它們。

因此,要找到所需的路徑,只需執行以下操作:

const myExePath = __dirname + '/node_modules/.bin/my-exe';
const binDir = execFileSync('npm', ['bin']).toString().trim();

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM