部署 Perl 应用程序

2024-01-22

部署 Perl 应用程序的最佳实践是什么?假设您正在部署到安装了少量 CPAN 模块的普通盒子上。理想的构建、部署方法是什么? Module::Build、ExtUtils::MakeMaker,其他?我正在从那些针对大型应用程序重复执行此操作的人那里寻找一些最佳实践想法。

该应用程序正在部署到服务器上。它不是 CPAN 或脚本。它实际上是一个 PSGI Web 应用程序。也就是说,大量的 Perl 包。

我目前有一个部署脚本,它使用 Net::SSH::Expect 通过 SSH 连接到新服务器,安装一些工具并配置服务器,然后从源代码管理中拉取所需的应用程序分支。这感觉不错,但这是最佳实践吗?

下一步是构建应用程序。跟踪和管理依赖项、从 CPAN 安装这些依赖项以及确保应用程序准备好运行的最佳实践是什么?

Thanks


我工作的公司目前为安装到系统 site_perl 目录中的每个 CPAN 和应用程序的内部依赖项(相当多的软件包!)构建 RPM。这有很多问题:

  • 随着版本在 CPAN 上不断更新,继续构建 RPM 非常耗时。
  • 将自己与系统 perl 联系起来意味着你的 perl 的成败取决于你的发行版的摆布(在 Centos 5 中,我们的 perl 最大版本为 5.8.8!)。
  • 如果您将多个应用程序部署到同一主机,则为所有应用程序使用一个 Perl 库意味着在不重新测试主机的每个应用程序的情况下升级依赖项可能会很危险。我们部署了相当多的独立发行版,所有发行版的维护关注程度都不同,所以这对我们来说是一件大事。

我们不再为每个依赖项构建 RPM,而是计划使用 carton [1] 为我们部署的每个应用程序构建一个完全独立的 Perl 库。我们正在将这些库构建到系统包中,但是如果您不想使用包管理器,您可以轻松地将它们压缩并手动将它们复制到适当的位置。

carton 的问题是,您需要设置一个内部 CPAN 镜像,如果您的应用程序依赖于 CPAN 之外的模块,则可以将内部依赖项安装到该镜像中。如果您不想处理这个问题,您始终可以手动将所需的库安装到 local::lib [2] 或 perlbrew [3] 中,并将生成的库打包以部署到您的生产环境中。

对于所有规定的解决方案,请务必小心 XS perl 库。您需要在与要部署到的主机相同的架构上构建 cartons/local:libs/perlbrews ,并确保您的生产框具有与您用于构建的相同的二进制依赖项。

回答有关源签出并安装到生产主机是否是最佳实践的问题的更新;我个人认为这不是一个好主意。我认为它有风险的原因在于,很难完全确定您安装的库集是否与您测试的库完全一致,因此部署可能是不可预测的。 Web 应用程序可能会加剧此问题,因为您很可能将相同的代码部署到多个生产环境中,而这些环境也可能不同步。虽然 Perl 社区在尝试发布向后兼容的高质量代码方面做得非常出色,但当出现问题时,通常需要付出很大的努力才能解决问题。这就是开发 carton 的原因,因为这会创建您需要在特定版本上冻结安装的所有发行版 tarball 的缓存,以便您可以可预测地部署代码。尽管如此;如果您愿意接受这种风险并在出现问题时进行修复,那么本地安装应该适合您。不过,至少我会强烈建议安装到 local::lib ,以便您可以在安装更新之前备份旧的本地库,以便在出现问题时有一个回滚点。

  1. Carton https://metacpan.org/module/Carton
  2. 本地::lib https://metacpan.org/module/local::lib
  3. perlbrew https://metacpan.org/module/perlbrew
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

部署 Perl 应用程序 的相关文章

随机推荐

  • SQL-如何将 YYYYMM 数字转换为日期

    所以我对 SQL 还很陌生 我有一个充满数字的列 以 YYYYMM 格式列出年份和月份 即 2016 年 7 月的 201607 我想知道是否可以在 SQL 中将其转换为正确的日期格式 我已经做了相当多的研究 并且看到了很多关于将 YYYY
  • 如何发送 zip 文件而不在物理位置创建它?

    我想发送带有 zip 文件附件的电子邮件 我可以发送 pdf 文件 而无需使用 ByteArrayOutputStream 将它们保存在物理位置 但是当我尝试压缩这些文件并发送它时它不起作用 它给出了非法附件的异常 下面是我编写的用于创建
  • 从 iOS 中的离屏 OpenGL 像素缓冲区读取像素 (OopenGL-ES)

    我想从屏幕外 不受 CAEAGLLayer 支持 帧缓冲区读取像素 我创建缓冲区的代码如下所示 glGenFramebuffersOES 1 storeFramebuffer glGenRenderbuffersOES 1 storeRen
  • Woocommerce 订单数量的倍数

    我试图将 woocommerce 限制为仅以 5 10 或 15 的固定数量进行销售 下面的代码片段 我在这个论坛上找到的 允许我将最小数量设置为 5 但我想知道是否有人可以建议是否可以将其修改为允许 5 10 或 15 我感谢您提供的任何
  • 如何找到文本光标的全局位置?

    我想执行一个QMenu http qt nokia com doc 4 0 qmenu html文本光标位置处的对象QPlainTextEdit http doc trolltech com main snapshot qplaintext
  • 你最喜欢的 C++ 编码风格习语是什么 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何使用 use_library('django','1.2')

    我正在学习在 Google App Engine 中进行开发 这是教程中的代码之一 http code google com appengine docs python gettingstarted usingwebapp html htt
  • 如何防止在 twitter bootstrap typeahead 插件中按 Enter 键提交

    我有一个输入文本 我应用它的预输入插件来建议项目 但是当我在输入文本上按 Enter 键时 它会提交表单 如何使用 twitter bootstrap typeahead 插件阻止表单提交 您可以通过向特定输入添加 ID 并简单地删除 En
  • git flow 发布选定的功能

    我正在尝试向我的团队介绍 Git 流程 我们是一个相当小的团队 而且非常敏捷 我们希望每天发布一次 这意味着我们测试当天所有更改的时间有限 业务团队希望能够控制正在发布的功能 尽管这并不理想 Git 流程似乎不能很好地适应这一点 从开发中删
  • 在 Android 中调整图片大小同时仍保持质量

    我想将图像文件大小减小到 100 KB 以下 同时保持图像质量 就像 Whatsapp 和 Facebook 所做的那样 我尝试了 stackoverflow 上几乎所有可用的 android 图像压缩代码 但这对我不起作用 现在我正在关注
  • C++14 中的递归 lambda 函数 [重复]

    这个问题在这里已经有答案了 在 C 11 中编写递归 lambda 函数有一个经常重复的 技巧 如下所示 std function
  • java.sql.Date 如何处理负日期?

    我遇到过这样的情况 当从数据库读取日期时 Java 运行时返回某种 反转 毫秒值 在java sql Date 毫秒值与天数大致相同 但从 0 年开始倒推 只需重新启动 Java 运行时即可解决该问题 但是 我发现 Java 几乎可以正确地
  • 如何在 Three.js 中实现 ShaderToy 着色器?

    寻找有关如何在 Threejs 中重新创建 ShaderToy 参数 iGlobalTime iChannel 等的信息 我知道 iGlobalTime 是自着色器启动以来经过的时间 我认为 iChannel 的东西是用于从纹理中提取 RG
  • 如何按最小增量更改 double

    是不是有什么东西坏了或者我不明白发生了什么 static String getRealBinary double val long tmp Double doubleToLongBits val StringBuilder sb new S
  • 为什么在 Scala 中使用 def 和 val ,反之亦然

    我知道这已经在其他帖子中讨论过 并且我了解使用之间的基本区别def and val def用于定义方法并且val以获得不可变的引用 我想通过问这个问题来完成的是了解是否还有更多的事情可以做def 它可以与 a 互换使用吗val 最近我尝试了
  • 分段错误处理程序中的分段错误

    Linux 下分段故障处理程序中发生的分段故障是否有一些定义的行为 是否会再次调用同一个处理程序 如果是 在所有平台上是否已定义等等 谢谢 答案取决于您如何安装信号处理程序 如果您使用已弃用的安装信号处理程序signal http linu
  • 如何防止div进出动画中的多次点击

    我想通过点击它来将 div 移入和移出 我只是像这样对 div 进行动画处理
  • 在 Bash 中如何查看字符串是否不在数组中?

    我试图在不添加额外代码 例如另一个 for 循环 的情况下执行此操作 我可以创建将字符串与数组进行比较的正逻辑 虽然我想要负逻辑并且只打印不在数组中的值 但本质上这是为了过滤掉系统帐户 我的目录中有这样的文件 admin user xml
  • SWIG 和 Python3 导入错误

    我用 C 编写了一个库 我使用SWIG http swig org为 Java Python 等生成绑定 我设法为这两种语言编写自定义类型映射等等 我还设法使用我的库 自定义协议 并与我用 C 编写的服务器 我用 Java 编写的客户端以及
  • 部署 Perl 应用程序

    部署 Perl 应用程序的最佳实践是什么 假设您正在部署到安装了少量 CPAN 模块的普通盒子上 理想的构建 部署方法是什么 Module Build ExtUtils MakeMaker 其他 我正在从那些针对大型应用程序重复执行此操作的