【问题标题】:Sofware Engineering: Combining many modular programs in Unix [closed]软件工程:在 Unix 中结合许多模块化程序 [关闭]
【发布时间】:2014-03-07 06:27:44
【问题描述】:

首先我的问题是:是否有任何标准/通用方法来实现维护和更新 MySQL 数据库的软件包

我是一名本科生研究助理,我的任务是创建一个 cron 作业来更新我们大学的一个内部生物信息学数据库。

我没有建立在完成工作各个方面的单一二进制文件上,而是将问题划分为子任务并编写了一些 python/c++ 模块来处理不同的任务,如下面的管道中所列:

  • 查询远程数据库以获取更新文件列表并返回给定时间间隔的结果(每月更新文件/每周/每天);
    • 在 python 中实现的模块。更新文件的 URL 输出到标准输出
  • 读取更新文件的相对 URL 并下载到本地目录
    • 在 python 中实现的模块
  • 解压缩新文件的每个存档
    • 作为 bash 脚本实现
  • 将文件解析为 CSV 格式
    • 用 C++ 实现的模块
  • 运行 MySQL 查询以将 CSV 文件插入数据库
    • 显然只是一个 bash 脚本

我不确定如何将这些模块组合到一个可以轻松移动到另一台机器的包中,比如如果我们当前的服务器空间不足并且需要将数据库复制到另一个文件系统(它是之前已经发生过一次)。

我的第一个想法是创建一个 bash 脚本,将所有这些模块通过管道连接在一起,因为它们都使用标准输入/标准输出进行操作,但这似乎是一种奇怪的做事方式。

或者,我可以将我的 C++ 代码编写为 python 扩展,将所有这些脚本打包在一起,然后只编写一个 python 文件来为我工作。

我应该使用包管理器以便我的代码可以轻松地安装在不同的机器上吗?包含 makefile 的整个更新程序的简单 zip 存档就足够了吗?

我对数据库管理非常陌生,并且在分发软件方面没有丰富的经验,但我想做好这个项目。提前感谢您的帮助。

【问题讨论】:

  • 实际上,通过管道或套接字进行进程间通信是 UNIX 中用于将简单程序组合成更复杂应用程序的一种非常标准的范例。

标签: mysql database unix software-packaging


【解决方案1】:

进程间通信 (IPC) 是将许多不同的程序组合成复杂应用程序的标准机制。 IPC 包括使用套接字(例如,从一个应用程序向另一个应用程序发出 HTTP 请求或通过 TCP 流发送数据),使用命名的 FIFO 和其他机制将一个程序的输出管道传输到另一个程序的输入。无论如何,使用 Bash 脚本来组合这些不同的元素(或者类似地,编写一个 Python 脚本来完成与 subprocess 模块相同的事情)是完全合理的。对于这种方法,我唯一要指出的是,由于您正在读取/写入数据库,因此您确实需要考虑使用这种方法的安全性/身份验证(例如,任何可以调用此应用程序的人都可以写入数据库?如何验证调用者是否具有适当的访问权限)。

关于分发,我想说最重要的是确保您可以在任何给定版本和以前的版本中找到所有组件及其在当时版本的依赖项的快照发布。您应该设置一个代码存储库(例如,在 GitHub 或您信任的其他服务上),并在每个发布时创建一个发布分支,其中包含该发布时所有工具的快照。这样一来,如果您安装了工具的唯一一台机器出现故障,您仍然可以立即获取代码副本并将其安装到新机器上(如果出现问题,您将能够回到较早的版本并进行二分搜索,直到找出损坏发生的位置)

在安装方面,实际上取决于涉及多少步骤。如果它像解压缩文件夹并确保该文件夹在您的 PATH 环境变量中一样简单,那么创建任何特殊的分发机制可能不值得麻烦(除非您能够轻松地做到这一点)。不过,我建议在存储库中的 INSTALL 或 README 文档中清楚地记录安装步骤(以便对说明进行快照)以及存储库的网站。如果步骤数量少且易于完成,那么我不会再费心了。如果涉及的步骤很多(比如下载和安装大量依赖项),那么我建议编写一个可以自动化安装过程的脚本。话虽如此,这确实是大学在这种情况下想要什么。

【讨论】:

    猜你喜欢
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    • 2022-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多