2017-03-09 61 views
0

我正在編寫一個定製的java-buildpack,我希望能夠編輯web.xml文件來添加一些必需的配置。但是,我似乎只限於實例節點上的rubygems,它不包含任何XML解析庫。如何在自定義Cloud Foundry buildpack中使用額外的rubygems?

如何讓buildpack指定它需要額外的gem來執行?將gem添加到buildpack本身的Gemfile中似乎對登臺應用程序沒有任何影響。

或者,我怎樣才能修改現有的XML文件只有CF中的庫存設施?我想避免一個正則表達式,但這可能是最後的手段。

+0

原來我可以在臨時容器中使用REXML包進行XML操作。 – Pickles

回答

2

然而,我似乎僅限於所存在的實例節點,其不包括任何XML解析庫上的rubygems。

正確。當構建包在臨時容器中運行時,它將使用容器提供的Ruby版本。這意味着你被鎖定到特定版本的Ruby和容器提供的一組gem。

解決這個問題的唯一方法是擁有一個引導shell腳本,用於下載Ruby,安裝您的Gems,然後運行實際的構建包Ruby腳本。雖然這是額外的工作和開銷,但如果可以避免的話,這可能不是一個好的選擇。

我該如何讓buildpack指定它需要額外的gem來執行?將gem添加到buildpack本身的Gemfile中似乎對登臺應用程序沒有任何影響。

我不認爲這是可能的。你不能gem install的東西,因爲它需要root訪問權限,你不會有。

你可以做的是在構建包中包含你需要的依賴關係。我們使用PHP構建包的YAML依賴項來完成此操作。如果你的依賴是所有的Ruby代碼(即沒有本地代碼),這應該工作正常。

或者,我該如何修改現有的XML文件,只使用CF中的庫存設施?我想避免一個正則表達式,但這可能是最後的手段。

這取決於你在做什麼以及你需要改變什麼。

  • 正則表達式搜索和替換是一個選項。
  • 基本字符串搜索和替換是另一個。
  • 您可以將其安裝到環境中,並且能夠解析/編輯XML的工具。如果它在安裝Java之後的安裝後期發生,那麼您可以運行一些Java代碼。

我不會推薦創建自定義堆棧。這是令人難以置信的侵入性,意味着你需要提供所有更新(不是一項小任務),而且如果你打算使用公共雲提供商,這不會有效,因爲沒有人會允許你安裝您的自定義堆棧在他們的公共雲中。

希望有幫助!

+1

謝謝!非常翔實,並支持我今天通過更多測試發現的內容。我確定REXML包在臨時容器中可用,並且能夠編寫一些基本代碼來執行我想要的操作。 爲了好奇,我需要在web.xml文件的頂部插入一些自定義servlet過濾器,以保證它們在過濾器鏈中處於第一位。 – Pickles

+0

非常有用的評論,謝謝! 不知道它是否可以在你的情況下有任何用處,但我注意到我們可以配置java buildpack以使用外部Tomcat配置,每個https://github.com/cloudfoundry/java-buildpack/blob/master/docs /container-tomcat.md#external-tomcat-configuration。 –