如何在自定义 Cloud Foundry buildpack 中使用额外的 ruby​​gems?

How do I use additional rubygems inside a custom Cloud Foundry buildpack?

我正在编写自定义的 java-buildpack,我希望能够编辑 web.xml 文件以添加一些必需的配置。但是,我似乎仅限于实例节点上存在的 rubygem,不包括任何 XML 解析库。

如何让 buildpack 指定它需要额外的 gem 才能执行?将 gems 添加到 buildpack 本身的 Gemfile 似乎在暂存应用程序时没有任何效果。

或者,我如何修改现有的 XML 文件,仅使用 CF 中可用的库存设施?我想避免使用正则表达式,但这可能是最后的手段。

为此,您可以使用所有必需的库创建自定义堆栈(容器根 fs)。

https://docs.cloudfoundry.org/devguide/deploy-apps/stacks.html

https://docs.cloudfoundry.org/adminguide/custom-stack.html

However, I seem to be limited to only the rubygems that are present on the instance node, which does not include any XML parsing libraries.

正确。当您的构建包 运行s 在暂存容器中时,它将使用容器提供的 Ruby 版本。这意味着您被锁定到特定版本的 Ruby 和容器提供的一组 gem。

解决此问题的唯一方法是使用 bootstrap shell 脚本下载 Ruby、安装您的 Gems,然后 运行 实际构建包Ruby 个脚本。虽然这是很多额外的工作和开销,所以如果可以避免它可能不是一个好的选择。

How can I have the buildpack specify that it needs an additional gem to execute? Adding gems to the Gemfile in the buildpack itself doesn't seem to have any effect when staging an app.

我不认为这是可能的。你不能 gem install 某些东西,因为它需要 root 访问权限,而你不会有。

您可以改为在构建包中包含您需要的依赖项。我们使用 PHP 构建包的 YAML 依赖项来做到这一点。如果您的依赖项全部是 Ruby 代码(即没有本机代码),这应该可以正常工作。

Alternatively, how can I modify an existing XML file with only the stock facilities available in CF? I wanted to avoid a regex, but that may be a last resort.

这取决于你在做什么以及你需要改变什么。

  • 正则表达式搜索和替换是一个选项。
  • 基本字符串搜索和替换是另一回事。
  • 您可以 shell 使用安装在环境中并且能够解析/编辑 XML
  • 的工具
  • 如果在安装 Java 之后的稍后安装过程中发生这种情况,您可以 运行 一些 Java 代码。

我不建议创建自定义堆栈。它具有令人难以置信的侵入性,意味着您随后需要提供所有更新(这不是一项小任务),如果您要使用 public 云提供商,它就不会起作用,因为没有人会这样做允许您在他们的 public 云中安装自定义堆栈。

希望对您有所帮助!