2017-03-09 58 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。 –