2014-04-25 30 views
0

我正在Ruby中開發應用程序。它起初是一個小型的命令行實用程序,但它現在變得相當大,基本上有三個不同的應用程序:一個命令行實用程序,一個Sinatra Web服務器和另一個暴露RESTful Web API的服務器,三個都依靠數據庫進行各種操作使用相同數據的不同事物。Ruby:如何正確地將應用程序拆分爲多個寶石

繼Yehuda Katz的this great article之後,我用bundler管理所有依賴關係,並將我的Gemfile.lock提交到源代碼控制。我依賴於許多第三方依賴項,並且對於某些我關心特定版本(由於已知問題)。

現在,應用程序的所有三個部分都使用一些常見的基礎結構代碼:主要是用於與數據庫通信的數據訪問層以及一個或兩個其他常見類。但除此之外,他們可以被視爲單獨的應用程序。 如果這是其他語言,比如Java,我可能會將它分成三個應用程序,並將常見的DAL代碼放入三個引用的類庫中。

在Ruby中,我知道gem應該用來打包代碼庫。 因此,我正在考慮爲應用程序創建三個寶石,併爲通用庫代碼創建第四個寶石。或者,也許三個「非寶石」應用程序,都依靠一個共同的寶石。

事情是,我不知道如何管理這種方式的第三方依賴。在上述文章中,YK指出,對於Gem開發,Gemfile.lock應將而不是添加到源代碼管理中。 就我而言,我確實需要我使用的某些第三方gem的特定版本,而Gemfile.lock在最近的初始部署期間一直非常重要。 此外,我不打算髮布這些寶石,因爲它不是一個開源項目。 我只需要一個很好的乾淨的方式來管理我的依賴項,包括第三方的寶石和內部。

所以......

  • 我應該創建四個不同的寶石?
  • 我應該把它分成三個應用程序,都依賴於我創建的一個常見寶石?
  • Gemfile.lock怎麼樣?在哪些情況下將它保持在源控制中是明智的,爲什麼?
  • 如果它不打算髮布,是否存在一些缺點或優勢,將寶石開發成一種普通的應用程序?

我很想聽到一些意見和建議,從經驗豐富的Ruby開發者如何做到這一點...

感謝。

回答

1

寶石不需要Gemfile.lock文件,因爲它們的依賴關係在gemspec中聲明。
要添加一個依賴使用add_runtime_dependency

spec.add_runtime_dependency 'example', '~> 1.1', '>= 1.1.4' 

但這不是部署方案不夠具體!
嗯,是的,但對於寶石部署意味着它將部署到應用程序中。應用程序應該具有Gemfile.lock文件以固定特定的庫版本。

應用程序部署需要完全可複製,因此應該精心維護構建所有庫版本的數量。另一方面,寶石努力與儘可能多的版本兼容以便可重複使用,否則,一個寶石更新將打破所有依賴它的寶石。

至於你的問題的其餘部分(是否和如何將你的應用程序分解成寶石) - 我認爲這不是適合的論壇,因爲它太寬泛,但我希望你的努力,你的努力讓您的軟件更易於管理,更可重複使用!

+0

謝謝。如果我理解正確,那麼將我的應用程序拆分爲gems-only,然後以這種方式指定依賴關係在部署方案中不太理想,因爲我無法控制所有依賴項的確切版本。這就是我的問題的原因。我只是想知道哪兩個選項更可取,以便以我可以管理用於部署的依賴關係的方式拆分應用程序,並且還可以在自己的庫中重用代碼。希望這個問題稍微縮小一點。我想確保我不會錯過任何東西。 – avivr

+0

@avivr - 在我的更新 –

+0

中嘗試回答您的問題,因此您確實回答了問題:)我收集的是,您建議有三個非寶石應用程序,每個應用程序都在Git中提交Gemfile.lock,在寶石中的通用代碼,所以它可以被重用。此外,我不應該關心gem自己的特定依賴版本,因爲三個應用程序中的Gemfile.lock將處理所有事情。正確? – avivr

相關問題