2014-01-30 97 views
5

我們的應用程序由兩部分組成:API和客戶端。兩者都是獨立的Node應用程序儘管API除了文檔之外還沒有真正的前端組件,它們仍然共享一些常見文件,例如Jade組件,規範化CSS,實用程序模塊以及Mongoose的模式定義,這些模式定義用於MongoDB交互。我真的不想習慣於我首先對API進行更改的工作流程,然後將更改後的文件複製到客戶端,反之亦然,因此找到可行的解決方案非常有用。在節點應用程序之間共享代碼

跨Node應用程序共享各種代碼的最佳方式是什麼?

在瀏覽網頁時,我遇到了一些解決方案,但在這種情況下它們都不起作用。

一個解決方案是使公共文件中的節點模塊與使用NPM的應用程序保持同步,但這意味着我(以及未來可能的開發人員)必須知道哪些文件是公共模塊的一部分,並要求他們使用require('node_modules/mongo/schemas/example.js')而不是require('mongo/schemas/example.js')。由於假設可能有數百個通用文件,因此不可能記住文件是否通用,特別是對於新開發者。

另一種解決方案是製作公用模塊的git子模塊。這將是完美的,只要我能夠將子模塊路徑包含到節點的所需路徑中,以防萬一在預期位置找不到所需文件(例如,mongo/schemas/example.js),它就會顯示在公共子模塊(common/mongo/schemas/example.js)中。這會很棒,因爲它會允許用「本地」版本覆蓋一個公共文件。這有點像Magento的作品。這裏的問題是Node不允許編輯require路徑(至少,假設它可能在Node 0.5之前),所以這是一個無賴。

第三種解決方案是將公共存儲庫的內容粗暴地合併到應用程序的根目錄中。在這個解決方案中沒有真正不可逾越的問題,但我覺得這是一種不好的做法。畢竟,它將無法通過應用程序編輯通用文件,因爲無法將通用文件選擇性地推送到通用的git存儲庫。所以基本上這個解決方案只會使工作流程變得更乏味:對公用文件的所有修改都必須手動複製到公共代碼庫,然後推送到git remote,然後複製到其他應用程序。所以這個解決方案對我來說絕對不會削減它。

看來,第二個解決方案是我唯一的(也是最好的)選項,除非你們提出了一個更好的選擇(我真的很希望:D)。如果有人知道改變節點需求路徑的方式,我將非常感激。

+0

優秀的問題。我聽到有人說你應該把所有的代碼放在npmjs.org中。但是,只有你可以開源纔可行。你可以製作私人npm回購,但我從來沒有這樣做過。 http://stackoverflow.com/questions/7575627/can-you-host-a-private-repository-for-your-organization-to-use-with-npm – Jess

回答

3

一種解決方案是讓一個節點模塊出共同文件,並與NPM

它是唯一一個很好的解決方案保持它在應用程序之間的同步。如果您有共享代碼,則應該是是一個模塊。

但是這意味着我(和未來可能的開發者)必須知道哪些文件是通用模塊的一部分,並要求他們與要求(「node_modules /蒙戈/模式/ example.js」),而不是要求('mongo/schemas/example.js')例如

不是,它是require('mongo/schemas/example.js')而不是require('./mongo/schemas/example.js')。或者更好的是,require('mongo').Schemas.example,雖然它需要一些工作。

你必須將你的代碼分割成邏輯模塊。我想那種惡夢你會有合理的使用NODE_PATH,但我真的建議重構...

+2

+1雖然值得一提的是,如果你有私人模塊也可以使用git repo(例如在github上)來託管一個模塊。再加上git標籤,你仍然可以獲得語義版本控制。請參閱http://www.devthought.com/2012/02/17/npm-tricks/ – qubyte

+0

@ MarkS.Everitt,不幸的是,您不會使用git標記獲得語義版本控制,npm [不支持它](https ://github.com/npm/npm/issues/4527)。你必須使用[yapm](https://github.com/rlidwka/yapm)或[visionmedia/npm](https://github.com/visionmedia/npm)才能使它工作。 – alex

+0

PS:建議是正確的,你可以使用私人註冊表或github倉庫來做到這一點 – alex

2

我試圖找到一個解決方案,你完全相同的問題,做了我指出的所有事情出in your other question。一切正常,但我知道我的工作流程可以改進。

嘗試1:增加遠程依賴關係的package.json和負荷NPM依賴

沒有工作,因爲當Heroku的安裝部署時依賴它沒有SSH密鑰從GitHub和基本拉auth(暴露的用戶名和密碼)不是一個選項。

嘗試2:git的子模塊救援

這帶來了your other question已經討論了一堆問題。


我終於結束了ONE(深思熟慮)項目,該項目擁有一切

我跑我的應用程序有一個標誌:

node app --module api 

node app --module manager 

和負載依賴性相應。

它可能不適合每個項目,但如果您有跨應用程序共享的模型,視圖,模板,常量和更多的業務邏輯,則前端和什麼交易都不錯。 我不認爲存儲現在是一個問題,所以安裝一些更多的依賴項和未使用的模塊可能不是問題(再次,它取決於項目的大小和依賴項的數量,在我的情況下,根本就沒有問題)。

然後,您可以針對每個服務應用程序的特定任務與grunt

grunt deploy:APIgrunt deploy:managergrunt:build:manager等..

+0

感謝您的意見,我一定會研究這個! –

+0

對不起,我的問題有點遲,但目前我面臨同樣的問題。你如何管理「--module」參數?在package.json文件中是否有模塊參數的配置選項,或者您是否簡單地使用app.js中的process.argv參數來檢測您必須加載/運行哪個模塊? – Nrgyzer

+0

在這種情況下,'--module'參數由app.js文件處理('node app ...'隱式運行當前工作目錄的app.js文件)。你的'app.js'應該是唯一的入口點,解析命令行標誌並基於此導入/運行模塊。您可以使用以下內容:https://www.npmjs.com/package/yargs來解析參數並以您喜歡的任何方式啓動應用程序。希望這可以幫助! – Maroshii

0

非常好的問題。

「但是這意味着我(和未來可能的開發者)必須知道哪些文件是通用模塊的一部分,並要求他們與要求(‘node_modules /蒙戈/模式/ example.js’)」

這其實是不正確的,因爲require將搜索項目的目錄樹中的文件夾node_modules按照該Loading from node_modules Folders文檔。

所以你的第一個選擇使用npm是一個非常好的選擇。實際上,我也在npm中創建了一個模塊。一旦你設置了package.json,你可以使用npm versionnpm publish發佈到npmjs.org。然後,您可以將所需的軟件包放入其他項目軟件包中。json並使用npm install從npm下載所需版本。如果你不想要,你需要create your own private npm repo

乾杯。

+1

是的,node_modules示例是一種誤導,因爲它沒有描述整個問題。我不認爲我可以非常有效地使用節點模塊來存儲靜態文件,比如JS或CSS,因爲它們是在/ public目錄之外處理的,而且我不確定如何將靜態資源從node_modules中路由出去,而無需亂用應用的本地資產路由。此外,我們的代碼是私人的,所以npmjs.org不是一個選項,並且使我們自己的npm回購看起來有點像項目本身。 –

+0

對於'需要':D你可以嘗試** browserify **在http://browserify.org/。 – Jess

相關問題