2011-09-25 61 views
4

我正在使用Go語言編寫一個非常簡單的Web應用程序。 我有一個獨立的版本,現在將其移植到GAE。似乎有非常小的變化,主要涉及數據存儲API(在獨立版本中我只需要文件)。 我還需要包含appengine包並使用init()而不是main()。在Go中合併獨立Web應用程序和GAE

是否有任何簡單的方法來合併兩個版本?由於Go中沒有預處理器,因此我必須爲獨立版本編寫一個兼容GAE的API,並使用此模擬模塊進行獨立構建,並使用真實API用於GAE版本。但這聽起來對我來說太過矯枉過正。另一個問題是,GAE可能會使用較舊的Go版本(例如,現在最近的Go版本使用新的模板包,但GAE使用較舊的版本,但它們不兼容)。那麼,在編譯時或運行時是否有改變來處理這些差異?

感謝, 塞爾

UPD:現在GAE使用相同的圍棋版本(R60),作爲穩定獨立的編譯器,所以抽象級別現在是真的很簡單。

回答

3

廣義而言,使用抽象。爲持久性提供接口,併爲其編寫兩個實現,一個基於數據存儲區,一個基於本地文件。然後,爲每個平臺編寫一個單獨的主/初始模塊,用於實例化適當的持久性接口,並將其傳遞給主應用程序以供使用。

1

我的直接答案是(如果你想保持GAE和非GAE版本),你使用了一個可靠的VCS,它擅長合併(可能是git或hg),併爲每個版本維護獨立的分支。 GAE API非常適合Go,因此不應該有太多變化。

至於不同版本的問題,您應該維護GAE版本中的代碼,並使用gofix(不幸是單向的)來製作與版本兼容的版本。唯一可能造成問題的地方是使用template程序包,該程序包已被棄用;如有必要,您可以在您的GAE軟件包中包含新的template軟件包。

如果您最終得到了您不想在Google服務器上運行的GAE代碼,那麼您還可以查看AppScale

+0

我真的不認爲這是一個可維護的解決方案。 –

+0

這很大程度上取決於原始程序的設計。值得一提的是,GAE已經*提供了一個可以被OP項目模擬的界面。 –

+0

我不認爲它是這樣 - 我認爲從長遠角度來看,保持這樣做會比做相當大量的重寫更有用。是的,App Engine提供了數據存儲接口 - 但是通過文件系統後端來實現(甚至是其中的一部分)將比實現適合手頭應用程序和多個後端的最小接口要多得多。 –