2016-09-23 76 views
0

我想創建一個使用ORM Bookshelf.js的庫(如果你願意的話,基本上是一個封裝在Bookshelf.js的頂部)。現在Bookshelf.js要求您運行驅動程序安裝,以便能夠連接到項目根目錄中的正確數據庫(例如:npm install mysql)。如何將庫傳遞給節點中較低的依賴項?

由於Bookshelf實例在其node_modules文件夾中沒有mysql依賴項,因此我自己的庫也需要這樣做,因爲Bookshelf.js需要它,但它一直說Error: Cannot find module 'mysql',這是正常的。

如果我打出來的結構,它是這樣的:

* New Project 
** mysql 
** LibThatUsesBookshelf 
**** Bookshelf 

現在Bookshelf.js可能需要這樣的結構:

* New Project 
** LibThatUsesBookshelf 
**** mysql 
**** Bookshelf 

有沒有辦法,我能仍然獲得方式顯示第一個結構的書架?

P.S.我知道這個解釋可能會讓人困惑,但這是一個很難的問題,我沒有別的辦法解釋它。

回答

0

讓你的模塊通的客戶端的實例書架:

// mysuperfancymodule.js 
module.exports = function(bookshelf) { 
    // do fancy things with the bookshelf instance 
} 
在您的客戶端應用程序

然後:

// some app code: 
var mySuperFancyModule = require('mysuperfancymodule'); // assuming it is published to npm 
var knex = require('knex')({ 
    // init knex... 
}); 
var bookshelf = require('bookshelf')(knex); 

mySuperFancyModule(bookshelf); // init my super fancy module 
+0

謝謝您的建議!我目前正在這樣做,但我想避免用戶能夠使用這個額外的依賴項。關於插件註冊和其他一些問題也有更多問題,這使我很難繼續這樣做。有沒有其他辦法可以解決這個問題? –

+0

這可能是個人品味,但我不明白爲什麼這會是一個缺點。它可以讓用戶在使用模塊之前自定義'knex'和'bookshelf'。這也使得你的模塊的用戶明顯依賴它。 – forrert

+0

好的,在考慮這個解決方案之後,我會回到傳遞bookshelf實例。感謝您的幫助! :)我將這個答案標記爲正確的,因爲它是最乾淨的一個,不需要將路徑注入到module.paths變量中。 –

相關問題